<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zhyiwww
    用平實的筆,記錄編程路上的點點滴滴………
    posts - 536,comments - 394,trackbacks - 0
    看JAVA源代碼,發現了string和stringBuffer操作的區別,總結如下:
    從對象實現上來說,都是通過char[]來實現的。
    如果new String(),那么數組的長度為0,如果new String("String"),那么char[]數組的長度就是你創建的字符串的長度。
    這個char[]在字符串創建以后是不會改變的。
    如果你只對這個串本身進行查找等對字符串無改變的操作的話,對于此數組本身是沒有影響的。但是如果,你要執行的是一個對此字符串本身有改變的操作的話,那么,是不可以的。
    但是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);
    ??? ??? }
    ??? }
    由此,我們可以知道,其實,此方法給我們返回的已經不是當前的字符串了,而是又創建了一個新的字符串,然后返回。
    其他的方法也類似。

    StringBuffer的實現,也是通過char[]來實現的。但是,默認的情況下,其自己創建了一個緩存數組,長度是16,這一點,我們可以通過StringBuffer的構造器來知道:
    ??? public StringBuffer() {
    ??? super(16);
    ??? }
    這個方法初始化了,char[]數組的長度是16。
    其父類構造器如下:
    ??? AbstractStringBuilder(int capacity) {
    ??????? value = new char[capacity];
    ??? }
    也就是說,默認的數組長度是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;
    ??? }

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

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





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

    FeedBack:
    # re: String和StringBuffer的區別
    2008-10-22 21:23 | lyshyhaungli
    學習了  回復  更多評論
      
    主站蜘蛛池模板: 国产男女爽爽爽爽爽免费视频| 五月天国产成人AV免费观看| 亚洲精品福利网泷泽萝拉| 久久久免费的精品| 免费看男人j放进女人j免费看| 亚洲欧美成人综合久久久| 亚洲天堂2016| 亚洲heyzo专区无码综合| 亚洲AV综合色区无码一二三区| 亚洲精品无码久久久久APP| 亚洲乱妇熟女爽到高潮的片| 亚洲欧美第一成人网站7777| 国产精品亚洲va在线观看| 黄页网站在线免费观看| 亚洲精品黄色视频在线观看免费资源 | 成全视频免费观看在线看| 精品一卡2卡三卡4卡免费视频| 男的把j放进女人下面视频免费| 无码人妻一区二区三区免费n鬼沢| 久久久久成人精品免费播放动漫| 99热这里只有精品免费播放| 亚洲国产精品免费在线观看| 最新国产乱人伦偷精品免费网站 | 亚洲av无码一区二区三区观看| 亚洲国产日韩综合久久精品| 亚洲视频免费一区| 激情内射亚洲一区二区三区爱妻| 亚洲欧美日韩国产精品一区| 人妻免费久久久久久久了| 美女在线视频观看影院免费天天看| 美丽的姑娘免费观看在线播放| 全免费a级毛片免费**视频| 亚洲日本在线观看视频| 亚洲高清视频在线观看| 亚洲日本国产综合高清| 色屁屁在线观看视频免费| a级片在线免费看| 国产一级在线免费观看| 69av免费观看| 国产一级淫片a视频免费观看| 亚洲精品无码久久久久|