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

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

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

    DANCE WITH JAVA

    開發(fā)出高質(zhì)量的系統(tǒng)

    常用鏈接

    統(tǒng)計

    積分與排名

    好友之家

    最新評論

    Jdk1.4 和jdk1.5中的StringBuffer的不同

    偶爾發(fā)現(xiàn),Jdk1.4 jdk1.5 中的 StringBuffer有些不同,做了個簡單調(diào)查


    toString()
    方法

    jdk1.4 中: StringBuffer toString() 是這樣實現(xiàn)的:

    public String toString() {

    ?????? return new String( this );

    }

    ?

    繼續(xù)跟蹤到 String 的構(gòu)造函數(shù):

    public String (StringBuffer buffer) {

    ??????? synchronized (buffer) {

    ??????????? buffer.setShared();

    ??????????? this . value = buffer.getValue();

    ??????????? this . offset = 0;

    ??????????? this . count = buffer.length();

    ??????? }

    ?}

    沒有重新 new 內(nèi)存空間,是共享的,這個時候首先想到的問題,如果 StringBuffer 變了, String 怎么辦

    ?

    繼續(xù)看 StringBuffer 的操做,例如 deleteCharAt ()

    public synchronized StringBuffer deleteCharAt( int index) {

    ??????? if ((index < 0) || (index >= count ))

    ?????? ??? throw new StringIndexOutOfBoundsException();

    ?????? if ( shared )

    ?????? ??? copy();

    ?????? System.arraycopy( value , index+1, value , index, count -index-1);

    ?????? count --;

    ??????? return this ;

    ?}

    ?

    StringBuffer 改變的時候 , 判斷了是否 shared, 然後決定是否 copy

    而且為了避免同步問題,把方法做成同步的

    ?

    ?

    ?

    ?

    jdk1.5

    public synchronized String toString() {

    ?????? return new String( value , 0, count );

    }

    跟蹤進入 String

    public String( char value[], int offset, int count) {

    ??????? if (offset < 0) {

    ??????????? throw new StringIndexOutOfBoundsException(offset);

    ??????? }

    ??????? if (count < 0) {

    ??????????? throw new StringIndexOutOfBoundsException(count);

    ??????? }

    ??????? // Note: offset or count might be near -1>>>1.

    ??????? if (offset > value. length - count) {

    ??????????? throw new StringIndexOutOfBoundsException(offset + count);

    ??????? }

    ??????? char [] v = new char [count];

    ??????? System.arraycopy(value, offset, v, 0, count);

    ??????? this . offset = 0;

    ??????? this . count = count;

    ??????? this . value = v;

    }

    重新分配了內(nèi)存空間

    ?

    再來看看 StringBuffer deleteCharAt

    public synchronized StringBuffer deleteCharAt( int index) {

    ??????? super .deleteCharAt(index);

    ??????? return this ;

    }

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    有了繼承關(guān)系,先不管,繼續(xù)

    public AbstractStringBuilder deleteCharAt( int index) {

    ??????? if ((index < 0) || (index >= count ))

    ?????? ??? throw new StringIndexOutOfBoundsException(index);

    ?????? System.arraycopy( value , index+1, value , index, count -index-1);

    ?????? count --;

    ??????? return this ;

    }

    不需要判斷,也不需要 copy

    ?

    既然看到了繼承關(guān)系,那我們先看一下這個繼承關(guān)系,再得出結(jié)論

    發(fā)現(xiàn)

    abstract class AbstractStringBuilder implements Appendable, CharSequence

    然後

    public final class StringBuffer

    ??? extends AbstractStringBuilder

    ??? implements java.io.Serializable, CharSequence

    ?

    public final class StringBuilder

    ??? extends AbstractStringBuilder

    ??? implements java.io.Serializable, CharSequence

    ?

    看一下 document 的解釋

    StringBuffer

    程安全的可 字符序列。

    StringBuilder

    一個可 的字符序列。

    ?

    ?

    現(xiàn)在可以大概做一下總結(jié)了:

    首先 toString() 方法 1.4 是不 new 新空間的,把 new 新空間推后到 StringBuffer 再次被更改,提高了性能。

    StirngBuffer 的一些方法是同步的

    ?

    Jdk1.5 區(qū)別對待,加入了繼承關(guān)系,加入了 StringBuilder

    StringBuffer 是線程安全的,同步的方法

    StringBuilder 的是線程不安全,非同步的

    在同步方面 jdk1.5 提供了更多的選擇。

    ?

    疑問,為什么 jdk1.5 中, StringBuffer 改變了 toString() 的實現(xiàn)呢

    暫時還沒找到好的原因,大部份原因都比較牽強。

    posted on 2006-10-17 14:29 dreamstone 閱讀(3518) 評論(4)  編輯  收藏 所屬分類: jdk相關(guān)

    評論

    # re: Jdk1.4 和jdk1.5中的StringBuffer的不同 2006-10-17 22:55 Web 2.0 技術(shù)資源

    實在是分析透徹啊 !!!

    至少我知道StringBuffer 通過什么來提高性能。

    謝謝樓主!!  回復(fù)  更多評論   

    # re: Jdk1.4 和jdk1.5中的StringBuffer的不同 2006-10-18 10:41 makefire

    ding

    ding a  回復(fù)  更多評論   

    # re: Jdk1.4 和jdk1.5中的StringBuffer的不同 2006-10-18 14:31 123bingbing

    增開7群,號碼 30440732
    8群 30756649
    9群 30178567
    10群 28694497

    我們的qq群:15096318 學(xué)習(xí)程序的都可以來  回復(fù)  更多評論   

    # re: Jdk1.4 和jdk1.5中的StringBuffer的不同 2006-11-07 16:42 dreamstone

    歡迎打家加入討論,共通進步  回復(fù)  更多評論   

    主站蜘蛛池模板: 亚洲综合综合在线| 99久久免费看国产精品| 亚洲国产成人精品青青草原| 亚洲午夜无码片在线观看影院猛 | 在线观看人成视频免费| 黄网站免费在线观看| 日产久久强奸免费的看| 亚洲乱妇老熟女爽到高潮的片| 久久精品a亚洲国产v高清不卡| 亚洲永久精品ww47| 又爽又黄无遮挡高清免费视频| 一二三四在线播放免费观看中文版视频| 人人揉揉香蕉大免费不卡| 久久久久久久久久免免费精品| 综合一区自拍亚洲综合图区| 亚洲欧美熟妇综合久久久久| 亚洲国产人成在线观看| 久久亚洲AV成人出白浆无码国产| 亚洲一区二区三区自拍公司| 亚洲欧洲日本在线| 亚洲?v无码国产在丝袜线观看| 成人永久免费高清| 全免费a级毛片免费看不卡| 可以免费看的卡一卡二| 国产四虎免费精品视频| 99久久精品日本一区二区免费| 30岁的女人韩剧免费观看| 亚洲免费精彩视频在线观看| 国产中文字幕在线免费观看| 一级特级aaaa毛片免费观看| 免费国产va在线观看| 日韩色日韩视频亚洲网站| 亚洲a∨国产av综合av下载| 亚洲欧好州第一的日产suv| 午夜亚洲国产理论片二级港台二级 | 久久久久亚洲AV片无码下载蜜桃| 亚洲s色大片在线观看| 久久精品国产99精品国产亚洲性色| 精品亚洲综合久久中文字幕| 亚洲日韩av无码| 久久精品国产亚洲AV大全|