zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          看JAVA源代碼,發(fā)現(xiàn)了string和stringBuffer操作的區(qū)別,總結(jié)如下:
          從對象實現(xiàn)上來說,都是通過char[]來實現(xiàn)的。
          如果new String(),那么數(shù)組的長度為0,如果new String("String"),那么char[]數(shù)組的長度就是你創(chuàng)建的字符串的長度。
          這個char[]在字符串創(chuàng)建以后是不會改變的。
          如果你只對這個串本身進行查找等對字符串無改變的操作的話,對于此數(shù)組本身是沒有影響的。但是如果,你要執(zhí)行的是一個對此字符串本身有改變的操作的話,那么,是不可以的。
          但是Strin對象為我們提供了此類操作的方法,比如concat()方法,源代碼如下:
          ??? public String concat(String s) {
          ??? ??? int i = s.length();
          ??? ??? if (i == 0) {
          ??? ??? ??? return this;
          ??? ??? } else {
          ??? ??? ??? char ac[] = new char[count + i];
          ??? ??? ??? getChars(0, count, ac, 0);
          ??? ??? ??? s.getChars(0, i, ac, count);
          ??? ??? ??? return new String(0, count + i, ac);
          ??? ??? }
          ??? }
          由此,我們可以知道,其實,此方法給我們返回的已經(jīng)不是當前的字符串了,而是又創(chuàng)建了一個新的字符串,然后返回。
          其他的方法也類似。

          StringBuffer的實現(xiàn),也是通過char[]來實現(xiàn)的。但是,默認的情況下,其自己創(chuàng)建了一個緩存數(shù)組,長度是16,這一點,我們可以通過StringBuffer的構(gòu)造器來知道:
          ??? public StringBuffer() {
          ??? super(16);
          ??? }
          這個方法初始化了,char[]數(shù)組的長度是16。
          其父類構(gòu)造器如下:
          ??? AbstractStringBuilder(int capacity) {
          ??????? value = new char[capacity];
          ??? }
          也就是說,默認的數(shù)組長度是16。
          很多的時候,容量16對于我們需要的串來說,可能遠遠不夠。怎么辦呢?
          在進行串的append的時候,StringBuffer會檢測剩余容量,并會重新擴充至當前容量的2倍。
          ??? public AbstractStringBuilder append(String str) {
          ??? if (str == null) str = "null";
          ??????? int len = str.length();
          ??? if (len == 0) return this;
          ??? int newCount = count + len;
          ??? if (newCount > value.length)
          ??? ??? expandCapacity(newCount);
          ??? str.getChars(0, len, value, count);
          ??? count = newCount;
          ??? return this;
          ??? }

          而擴容的同時,會創(chuàng)建一個新的數(shù)組,并將原來的數(shù)組內(nèi)容復(fù)制到新的數(shù)組里面。
          由此可見,如果容量不足的話,那么每一次擴容,都會耗掉大量的資源,盡管,你可能擴充的容量也很小。如果,數(shù)組的長度很大,耗掉的資源就會更多。
          所以,我們在使用stringbuffer的時候,要一次在創(chuàng)建對象的時候給與足夠多的空間,這樣會提高性能。
          有利必有弊,這個性能是以空間為代價。但是相對于性能的喪失來說,應(yīng)該還是值得的。

          如果不需要擴容的話,那么所有的操作都是基于同一個數(shù)組,那么像對于string的操作來說,不需要每一次都創(chuàng)建對象了,省去了創(chuàng)建對象的時間,性能是要好很多的,同時,String的串操作,會用去很多的空間,對于虛擬機來說,也增加了很大的壓力。





          |----------------------------------------------------------------------------------------|
                                     版權(quán)聲明  版權(quán)所有 @zhyiwww
                      引用請注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2008-04-25 15:37 zhyiwww 閱讀(3307) 評論(1)  編輯  收藏 所屬分類: java basic

          FeedBack:
          # re: String和StringBuffer的區(qū)別
          2008-10-22 21:23 | lyshyhaungli
          學習了  回復(fù)  更多評論
            
          主站蜘蛛池模板: 台安县| 漳州市| 克什克腾旗| 安义县| 浦东新区| 文昌市| 页游| 富锦市| 鄢陵县| 宝山区| 内黄县| 延长县| 阳高县| 洪湖市| 从江县| 综艺| 铜山县| 扎兰屯市| 金乡县| 驻马店市| 丹棱县| 济源市| 望江县| 尚志市| 浦江县| 明星| 达日县| 古丈县| 如皋市| 安乡县| 梨树县| 阿勒泰市| 红安县| 杨浦区| 社旗县| 奎屯市| 太湖县| 枣阳市| 镇雄县| 凤翔县| 腾冲县|