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

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

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

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

    StringBuffer的實(shí)現(xiàn),也是通過char[]來實(shí)現(xiàn)的。但是,默認(rèn)的情況下,其自己創(chuàng)建了一個(gè)緩存數(shù)組,長度是16,這一點(diǎn),我們可以通過StringBuffer的構(gòu)造器來知道:
    ??? public StringBuffer() {
    ??? super(16);
    ??? }
    這個(gè)方法初始化了,char[]數(shù)組的長度是16。
    其父類構(gòu)造器如下:
    ??? AbstractStringBuilder(int capacity) {
    ??????? value = new char[capacity];
    ??? }
    也就是說,默認(rèn)的數(shù)組長度是16。
    很多的時(shí)候,容量16對(duì)于我們需要的串來說,可能遠(yuǎn)遠(yuǎn)不夠。怎么辦呢?
    在進(jìn)行串的append的時(shí)候,StringBuffer會(huì)檢測剩余容量,并會(huì)重新擴(kuò)充至當(dāng)前容量的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;
    ??? }

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

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





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

    FeedBack:
    # re: String和StringBuffer的區(qū)別
    2008-10-22 21:23 | lyshyhaungli
    學(xué)習(xí)了  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 最新亚洲人成网站在线观看| 国产精品亚洲综合天堂夜夜| 亚洲精品福利你懂| 啦啦啦在线免费视频| 人成电影网在线观看免费| 四虎AV永久在线精品免费观看| 在线精品自拍亚洲第一区| 国产亚洲精品岁国产微拍精品| 日本中文字幕免费看| 亚洲2022国产成人精品无码区| 成熟女人特级毛片www免费| a高清免费毛片久久| 亚洲乱码无限2021芒果| 亚洲av无码成人精品区| 中文字幕免费视频| 疯狂做受xxxx高潮视频免费| 亚洲AV日韩AV永久无码久久| 国产精品高清全国免费观看| 四虎国产成人永久精品免费| 免费看内射乌克兰女| 亚洲色成人网一二三区| 亚洲Av无码乱码在线znlu| 亚洲综合免费视频| 三级毛片在线免费观看| 亚洲欧洲免费无码| 亚洲天堂中文资源| 麻豆一区二区免费播放网站 | 亚洲欧洲免费无码| 久久精品国产亚洲| 免费一区二区三区四区五区| 精品国产无限资源免费观看| 中国一级特黄的片子免费 | 亚洲欧洲在线观看| 精品亚洲成α人无码成α在线观看| 国产免费av片在线看| 久久久久久成人毛片免费看| 又大又硬又粗又黄的视频免费看 | 亚洲欧美日韩综合久久久| 亚洲天堂久久精品| 亚洲av无码国产精品夜色午夜| 免费在线观看毛片|