posts - 3,comments - 1,trackbacks - 0
          今天開始學(xué)習(xí)linux系統(tǒng)管理,好好學(xué)習(xí),賺更多的錢!!
          一.給我這樣的生瓜的一點(diǎn)建議:
             1.盡力去學(xué)好vi編輯器(在linux系統(tǒng)中最常見的是它的一種經(jīng)過重寫的形式,vim)
               盡管一開始大家很不習(xí)慣,也要克服。
             2.熟練掌握perl和shell語言,因?yàn)樵趌inux世界里,他就是你的利器。
               當(dāng)然Python語言也是一個(gè)不錯(cuò)的語言,他可讀性好 易于維護(hù) 也要學(xué)偶。
             3.書上推薦學(xué)習(xí)一種叫except編程語言,從沒聽過,說是用于驅(qū)動(dòng) 交互式程序執(zhí)行的前段語言。
          二.linux于unix的關(guān)系
             1.linux重寫了unix,也豐富了unix,它遵循posix標(biāo)準(zhǔn),能夠在幾種硬件平臺(tái)上運(yùn)行,兼容現(xiàn)有的大多數(shù)       unix軟件,說到這里大家可能會(huì)認(rèn)為linux就是unix的一種變體,但說到底不還是unix嗎,我也是這么
             認(rèn)為的,書上說他倆是不同的,在我看來不是很讓我信服,可能是我不喜歡遵守法律的原因吧。
            (原文兩個(gè)理由如下:)
                 ---他同大多數(shù)的unix變體不同的是,他是自由的,開源的,而且由成百上千的個(gè)人和組織無私奉獻(xiàn)
                     協(xié)同開發(fā)出來,linux融入了在原來unix版本中沒有的技術(shù)改進(jìn),所以說它超出了克隆unix的范疇,
                    (這里我不太明白的是到底u(yù)nix根本就沒辦法實(shí)現(xiàn)所為的技術(shù)改進(jìn),還是說現(xiàn)有的版本還沒有推出)
                 ---從法律上講,它也是有別于unix的東西,嚴(yán)格來說不能稱為unix
                    (迷糊!!!!!,外國人到底是真的遵守法律還是為了商業(yè))
              2. 論述完以上linux不是unix的論斷后,他后面有來了一句
                 ---- 還值得一提的是linux不是現(xiàn)今世界上唯一的自由unix版本
                     (我日,是翻譯藍(lán)那  還是我的理解有問題 ??
              3.在一個(gè)知道一個(gè)名詞BSD
                  (UC Berkely )加州大學(xué)的伯克利分校的BSD(Berkely Software Distribution)伯克利軟件發(fā)布
           

              
          posted @ 2010-07-22 06:46 高天賜 閱讀(170) | 評(píng)論 (0)編輯 收藏
          今天修改一個(gè)前人的程序,一段sql文,里面的內(nèi)容一個(gè)很奇怪的地方,
          SELECT
            .
            ..
          FORM
             TABLE1 A,
             TABLE2 B
          WHERE
             A.FROMID 
          = B.TOID
             
          AND ..
             
          AND .


          這里面a表中的FromId 是char(8),b表中的toId是char(9) 一開始感覺這能出來數(shù)據(jù)嗎 可真他娘的出來了,暈!!!,公司不讓上網(wǎng),看書找不到介紹,自己慢慢猜測(cè),一定是oracle自動(dòng)給位數(shù)小的補(bǔ)足了空格。
          回到家里上網(wǎng)查了一下,找到答案了,大概摘錄一下,給自己以后提個(gè)醒,如果有什么不對(duì)的地方希望那個(gè)大家批評(píng)指教!!!

          Oracle使用以下兩種比較規(guī)則:
          1、空格補(bǔ)齊比較語法
          對(duì)于類型CHAR、NCHAR、text literals、USER函數(shù)值, 在進(jìn)行比較時(shí), 先在較短的那個(gè)
          字符串后補(bǔ)上空格以使長度相等, 然后再進(jìn)行比較. 注意b.toId = ‘12345678’也會(huì)是true的
          2、非補(bǔ)齊比較語法
          對(duì)于類型VARCHAR2、NVARCHAR2, 則不用補(bǔ)齊, 直接進(jìn)行比較.

          posted @ 2010-07-20 06:15 高天賜 閱讀(523) | 評(píng)論 (0)編輯 收藏

          最近見版內(nèi)對(duì)String討論的帖子很多,但是又眾說風(fēng)云,為了讓大家徹底理解String這個(gè)特殊對(duì)象,我趁此機(jī)會(huì)來對(duì)String對(duì)象做進(jìn)一步的分析。

          友情提示:希望在閱讀之前,你已經(jīng)對(duì)String對(duì)象有了基礎(chǔ)的了解。并且已經(jīng)熟知"類型"、"引用"、"對(duì)象"、"實(shí)例化"、"堆棧"和關(guān)于Object對(duì)象的equals()方法的使用機(jī)制,并且已經(jīng)熟知String對(duì)象對(duì)equals()方法重寫后的使用機(jī)制!

          首先大家知道,String既可以作為一個(gè)對(duì)象來使用,又可以作為一個(gè)基本類型來使用。這里指的作為一個(gè)基本類型來使用只是指使用方法上的,比如String s = "Hello",它的使用方法如同基本類型int一樣,比如int i = 1;,而作為一個(gè)對(duì)象來使用,則是指通過new關(guān)鍵字來創(chuàng)建一個(gè)新對(duì)象,比如String s = new String("Hello")。但是它的內(nèi)部動(dòng)作其實(shí)還是創(chuàng)建了一個(gè)對(duì)象,這點(diǎn)稍后會(huì)說到。

          其次,對(duì)String對(duì)象的比較方法需要了解。Java里對(duì)象之間的比較有兩種概念,這里拿String對(duì)象來說:一種是用"=="來比較,這種比較是針對(duì)兩個(gè)String類型的變量的引用,也就是說如果兩個(gè)String類型的變量,它們所引用同一個(gè)String對(duì)象(即指向同一塊內(nèi)存堆),則"=="比較的結(jié)果是true。另一種是用Object對(duì)象的equals()方法來比較,String對(duì)象繼承自O(shè)bject,并且對(duì)equals()方法進(jìn)行了重寫。兩個(gè)String對(duì)象通過equals()方法來進(jìn)行比較時(shí),其實(shí)就是對(duì)String對(duì)象所封裝的字符串內(nèi)容進(jìn)行比較,也就是說如果兩個(gè)String對(duì)象所封裝的字符串內(nèi)容相同(包括大小寫相同),則equals()方法將返回true。

          現(xiàn)在開始將對(duì)String對(duì)象的創(chuàng)建做具體的分析。

          首先看以下代碼段:

          String s1 = new String("Hello");
          String s2 = new String("Hello");

          System.out.println(s1 == s2);
          System.out.println(s1.equals(s2));

          以上代碼段的打印結(jié)果是:

          false
          true

          這個(gè)結(jié)果相信大家很好理解,兩個(gè)String類型的變量s1和s2都通過new關(guān)鍵字分別創(chuàng)建了一個(gè)新的String對(duì)象,這個(gè)new關(guān)鍵字為創(chuàng)建的每個(gè)對(duì)象分配一塊新的、獨(dú)立的內(nèi)存堆。因此當(dāng)通過"=="來比較它們所引用的是否是同一個(gè)對(duì)象時(shí),將返回false。而通過equals()方法來比較時(shí),則返回true,因?yàn)檫@兩個(gè)對(duì)象所封裝的字符串內(nèi)容是完全相同的。

          好,現(xiàn)在把上面的代碼段修改如下:

          String s1 = new String("Hello");
          String s2 = s1;

          System.out.println(s1 == s2);
          System.out.println(s1.equals(s2));

          以上代碼段的打印結(jié)果是:

          true
          true

          這個(gè)結(jié)果應(yīng)該更好理解,變量s1還是通過new關(guān)鍵字來創(chuàng)建了一個(gè)新的String對(duì)象,但這里s2并沒有通過new關(guān)鍵字來創(chuàng)建一個(gè)新的String對(duì)象,而是直接把s1賦值給了s2,即把s1的引用賦值給了s2,所以s2所引用的對(duì)象其實(shí)就是s1所引用的對(duì)象。所以通過"=="來比較時(shí),返回true。既然它們引用的都是同一個(gè)對(duì)象,那么通過equals()方法來比較時(shí),肯定也返回true,這里equals()方法其實(shí)在對(duì)同一個(gè)對(duì)象進(jìn)行比較,自己肯定等于自己咯。

          說到此,其實(shí)應(yīng)該沒什么大問題,因?yàn)檫@些都是標(biāo)準(zhǔn)的創(chuàng)建對(duì)象的動(dòng)作,但是String對(duì)象還有另一種使用方法,也就是開頭所提到的可以作為一個(gè)基本類型來使用,請(qǐng)看以下代碼段:

          String s = "Hello";

          看到這里,相信一些初學(xué)的朋友或者對(duì)String對(duì)象還沒搞清楚的朋友開始疑惑了,你肯定會(huì)問,這個(gè)使用方法在其內(nèi)部到底發(fā)生了什么?其實(shí)這就是String對(duì)象容易混淆的關(guān)鍵!

          其實(shí)在啟動(dòng)程序時(shí),虛擬機(jī)會(huì)創(chuàng)建一塊String對(duì)象的String緩沖池。當(dāng)String對(duì)象作為一個(gè)基本類型來使用時(shí),比如:String s = "Hello";,虛擬機(jī)會(huì)先在這個(gè)String緩沖池內(nèi)尋找是否有相同值的String對(duì)象存在,如果存在,則把這個(gè)String對(duì)象的引用賦值給s。如果不存在,虛擬機(jī)會(huì)先在這個(gè)String緩沖池內(nèi)創(chuàng)建此String對(duì)象,然后把引用賦值給s。

          說到這里,相信大家已經(jīng)開始明白了。那么請(qǐng)看下面的代碼段:

          String s1 = "Hello";
          String s2 = "Hello";

          System.out.println(s1 == s2);
          System.out.println(s1.equals(s2));

          以上代碼段的打印結(jié)果是:

          true
          true

          為什么這個(gè)結(jié)果?那么來分析一下。首先這兩個(gè)String對(duì)象都是作為一個(gè)基本類型來使用的,而不是通過new關(guān)鍵字來創(chuàng)建的,因此虛擬機(jī)不會(huì)為這兩個(gè)String對(duì)象分配新的內(nèi)存堆,而是到String緩沖池中來尋找。

          首先為s1尋找String緩沖池內(nèi)是否有與"Hello"相同值的String對(duì)象存在,此時(shí)String緩沖池內(nèi)是空的,沒有相同值的String對(duì)象存在,所以虛擬機(jī)會(huì)在String緩沖池內(nèi)創(chuàng)建此String對(duì)象,其動(dòng)作就是new String("Hello");。然后把此String對(duì)象的引用賦值給s1。

          接著為s2尋找String緩沖池內(nèi)是否有與"Hello"相同值的String對(duì)象存在,此時(shí)虛擬機(jī)找到了一個(gè)與其相同值的String對(duì)象,這個(gè)String對(duì)象其實(shí)就是為s1所創(chuàng)建的String對(duì)象。既然找到了一個(gè)相同值的對(duì)象,那么虛擬機(jī)就不在為此創(chuàng)建一個(gè)新的String對(duì)象,而是直接把存在的String對(duì)象的引用賦值給s2。

          這里既然s1和s2所引用的是同一個(gè)String對(duì)象,即自己等于自己,所以以上兩種比較方法都返回ture。

          到這里,對(duì)String對(duì)象的基本概念應(yīng)該都已經(jīng)理解了。現(xiàn)在我來小結(jié)一下:

          針對(duì)String作為一個(gè)基本類型來使用:

          1。如果String作為一個(gè)基本類型來使用,那么我們視此String對(duì)象是String緩沖池所擁有的。
          2。如果String作為一個(gè)基本類型來使用,并且此時(shí)String緩沖池內(nèi)不存在與其指定值相同的String對(duì)象,那么此時(shí)虛擬機(jī)將為此創(chuàng)建新的String對(duì)象,并存放在String緩沖池內(nèi)。
          3。如果String作為一個(gè)基本類型來使用,并且此時(shí)String緩沖池內(nèi)存在與其指定值相同的String對(duì)象,那么此時(shí)虛擬機(jī)將不為此創(chuàng)建新的String對(duì)象,而直接返回已存在的String對(duì)象的引用。

          針對(duì)String作為一個(gè)對(duì)象來使用:

          1。如果String作為一個(gè)對(duì)象來使用,那么虛擬機(jī)將為此創(chuàng)建一個(gè)新的String對(duì)象,即為此對(duì)象分配一塊新的內(nèi)存堆,并且它并不是String緩沖池所擁有的,即它是獨(dú)立的。

          理解了以上內(nèi)容后,請(qǐng)看以下代碼段:

          String s1 = "Hello";
          String s2 = new String("Hello");

          System.out.println(s1 == s2);
          System.out.println(s1.equals(s2));

          以上代碼段的打印結(jié)果是:

          false
          true

          根據(jù)上面的小結(jié)來進(jìn)行分析。第一行是把String作為一個(gè)基本類型來使用的,因此s1所引用的對(duì)象是屬于String緩沖池內(nèi)的。并且此時(shí)String緩沖池內(nèi)并沒有與其值相同的String對(duì)象存在,因此虛擬機(jī)會(huì)為此創(chuàng)建一個(gè)新的String對(duì)象,即new String("Hello");。第二行是把String作為一個(gè)對(duì)象來使用的,因此s2所引用的對(duì)象不屬于String緩沖池內(nèi)的,即它是獨(dú)立的。通過new關(guān)鍵字,虛擬機(jī)會(huì)為此創(chuàng)建一個(gè)新的String對(duì)象,即為它分配了一塊新的內(nèi)存堆。因此"=="比較后的結(jié)果是false,因?yàn)閟1和s2所引用的并不是同一個(gè)對(duì)象,它們是獨(dú)立存在的。而equals()方法所返回的是true,因?yàn)檫@兩個(gè)對(duì)象所封裝的字符串內(nèi)容是完全相同的。

          現(xiàn)在,相信大家已經(jīng)完全搞清楚String對(duì)象是怎么一回事了:)但是到此并沒有結(jié)束,因?yàn)镾tring對(duì)象還有更深層次的應(yīng)用。

          這里我將分析一下String對(duì)象的intern()方法的應(yīng)用。
          intern()方法將返回一個(gè)字符串對(duì)象的規(guī)范表示法,即一個(gè)同該字符串內(nèi)容相同的字符串,但是來自于唯一字符串的String緩沖池。這聽起來有點(diǎn)拗口,其實(shí)它的機(jī)制有如以下代碼段:

          String s = new String("Hello");
          s = s.intern();

          以上代碼段的功能實(shí)現(xiàn)可以簡單的看成如下代碼段:

          String s = "Hello";

          你一定又開始疑惑了?那么你可以先看第二個(gè)代碼段。第二個(gè)代碼段的意思就是從String緩沖池內(nèi)取出一個(gè)與其值相同的String對(duì)象的引用賦值給s。如果String緩沖池內(nèi)沒有與其相同值的String對(duì)象存在,則在其內(nèi)為此創(chuàng)建一個(gè)新的String對(duì)象。那么第一段代碼的意思又是什么呢?我們知道通過new關(guān)鍵字所創(chuàng)建出的對(duì)象,虛擬機(jī)會(huì)為它分配一塊新的內(nèi)存堆。如果平凡地創(chuàng)建相同內(nèi)容的對(duì)象,虛擬機(jī)同樣會(huì)為此分配許多新的內(nèi)存堆,雖然它們的內(nèi)容是完全相同的。拿String對(duì)象來說,如果連續(xù)創(chuàng)建10個(gè)相同內(nèi)容的String對(duì)象(new String("Hello")),那么虛擬機(jī)將為此分配10塊獨(dú)立的內(nèi)存堆。假設(shè)所創(chuàng)建的String對(duì)象的字符串內(nèi)容十分大,假設(shè)一個(gè)Stirng對(duì)象封裝了1M大小的字符串內(nèi)容,那么如果我們創(chuàng)建10個(gè)此相同String對(duì)象的話,我們將會(huì)毫無意義的浪費(fèi)9M的內(nèi)存空間。我們知道String是final類,它所封裝的是字符串常量,因此String對(duì)象在創(chuàng)建后其內(nèi)部(字符串)值不能改變,也因此String對(duì)象可以被共享。所以對(duì)于剛才提到的假設(shè),我們所創(chuàng)建的10個(gè)相同內(nèi)容的String對(duì)象,其實(shí)我們只需為此創(chuàng)建一個(gè)String對(duì)象,然后被其它String變量所共享。要實(shí)現(xiàn)這種機(jī)制,唯一的、簡單的方法就是使用String緩沖池,因?yàn)镾tring緩沖池內(nèi)不會(huì)存在相同內(nèi)容的String對(duì)象。而intern()方法就是使用這種機(jī)制的途徑。在一個(gè)已實(shí)例化的String對(duì)象上調(diào)用intern()方法后,虛擬機(jī)會(huì)在String緩沖池內(nèi)尋找與此Stirng對(duì)象所封裝的字符串內(nèi)容相同值的String對(duì)象,然后把引用賦值給引用原來的那個(gè)String對(duì)象的String類型變量。如果String緩沖池內(nèi)沒有與此String對(duì)象所封裝的字符串內(nèi)容相同值的String對(duì)象存在,那么虛擬機(jī)會(huì)為此創(chuàng)建一個(gè)新的String對(duì)象,并把其引用賦值給引用原來的那個(gè)String對(duì)象的String類型變量。這樣就達(dá)到了共享同一個(gè)String對(duì)象的目的,而原先那個(gè)通過new關(guān)鍵字所創(chuàng)建出的String對(duì)象將被拋棄并被垃圾回收器回收掉。這樣不但降低了內(nèi)存的使用消耗,提高了性能,而且在String對(duì)象的比較上也同樣更方便了,因?yàn)橄嗤腟tring對(duì)象將被共享,所以要判斷兩個(gè)String對(duì)象是否相同,則只需要使用"=="來比較,而無需再使用equals()方法來比較,這樣不但使用起來更方便,而且也提高了性能,因?yàn)镾tring對(duì)象的equals()方法將會(huì)對(duì)字符串內(nèi)容拆解,然后逐個(gè)進(jìn)行比較,如果字符串內(nèi)容十分大的話,那么這個(gè)比較動(dòng)作則大大降低了性能。

          說到此,大家可能對(duì)具體應(yīng)用還有點(diǎn)模糊,那么我來舉個(gè)簡單的示例,以便闡述以上概念:

          假設(shè)有一個(gè)類,它有一個(gè)接收消息的方法,這個(gè)方法記錄用戶傳來的消息(假設(shè)消息內(nèi)容可能較大,并且重復(fù)率較高),并且把消息按接收順序記錄在一個(gè)列表中。我想有些朋友會(huì)這樣設(shè)計(jì):

          import java.util.*;

          public class Messages {

          ArrayList messages = new ArrayList();

          public void record(String msg) {
          messages.add(msg);
          }

          public List getMessages() {
          return messages;
          }
          }

          這種設(shè)計(jì)方案好嗎?假設(shè)我們重復(fù)的發(fā)送給record()方法同一個(gè)消息(消息來自不同的用戶,所以可以視每個(gè)消息為一個(gè)new String("...")),并且消息內(nèi)容較大,那么這個(gè)設(shè)計(jì)將會(huì)大大浪費(fèi)內(nèi)存空間,因?yàn)橄⒘斜碇杏涗浀亩际切聞?chuàng)建的、獨(dú)立的String對(duì)象,雖然它們的內(nèi)容都相同。那么怎么樣可以對(duì)其進(jìn)行優(yōu)化呢,其實(shí)很簡單,請(qǐng)看如下優(yōu)化后的示例:

          import java.util.*;

          public class Messages {

          ArrayList messages = new ArrayList();

          public void record(String msg) {
          messages.add(msg.intern());
          }

          public List getMessages() {
          return messages;
          }
          }

          正如你所看到的,原先record()方法中的messages.add(msg);代碼段變成了messages.add(msg.intern());,僅僅對(duì)msg參數(shù)調(diào)用了intern()方法,這樣將對(duì)重復(fù)的消息進(jìn)行共享機(jī)制,從而降低了內(nèi)存消耗,提高了性能。

          這個(gè)例子的確有點(diǎn)牽強(qiáng),但是這里只是為了闡述以上概念!

          至此,String對(duì)象的迷霧都被消除了,大家只要牢記這些概念,以后再復(fù)雜的String應(yīng)用都可以建立在此基礎(chǔ)上來進(jìn)行分析。

          posted @ 2007-02-04 20:13 高天賜 閱讀(276) | 評(píng)論 (1)編輯 收藏
          主站蜘蛛池模板: 九龙城区| 兴宁市| 柯坪县| 军事| 石河子市| 渑池县| 莱州市| 临洮县| 石城县| 巴彦淖尔市| 璧山县| 阳泉市| 巴马| 察哈| 东海县| 阜南县| 石棉县| 湖南省| 安阳市| 河北区| 六枝特区| 通城县| 汤阴县| 藁城市| 清镇市| 昆山市| 南投县| 玉门市| 盱眙县| 深泽县| 崇明县| 云南省| 迁西县| 青州市| 盈江县| 青铜峡市| 福州市| 新郑市| 三江| 阿克陶县| 长治县|