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

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

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

    DANCE WITH JAVA

    開發出高質量的系統

    常用鏈接

    統計

    積分與排名

    好友之家

    最新評論

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

    偶爾發現,Jdk1.4 jdk1.5 中的 StringBuffer有些不同,做了個簡單調查


    toString()
    方法

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

    public String toString() {

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

    }

    ?

    繼續跟蹤到 String 的構造函數:

    public String (StringBuffer buffer) {

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

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

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

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

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

    ??????? }

    ?}

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

    ?

    繼續看 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;

    }

    重新分配了內存空間

    ?

    再來看看 StringBuffer deleteCharAt

    public synchronized StringBuffer deleteCharAt( int index) {

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

    ??????? return this ;

    }

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    有了繼承關系,先不管,繼續

    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

    ?

    既然看到了繼承關系,那我們先看一下這個繼承關系,再得出結論

    發現

    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

    一個可 的字符序列。

    ?

    ?

    現在可以大概做一下總結了:

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

    StirngBuffer 的一些方法是同步的

    ?

    Jdk1.5 區別對待,加入了繼承關系,加入了 StringBuilder

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

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

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

    ?

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

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

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

    評論

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

    實在是分析透徹啊 !!!

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

    謝謝樓主!!  回復  更多評論   

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

    ding

    ding a  回復  更多評論   

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

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

    我們的qq群:15096318 學習程序的都可以來  回復  更多評論   

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

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

    主站蜘蛛池模板: 一级毛片高清免费播放| 国产三级电影免费观看| 韩国日本好看电影免费看| 亚洲高清成人一区二区三区| 亚洲av日韩综合一区在线观看| 亚洲人成在线免费观看| 免费一区二区无码视频在线播放 | 亚洲一区二区三区在线播放| 久久亚洲私人国产精品| 青草久久精品亚洲综合专区| 免费鲁丝片一级在线观看| 日韩欧美亚洲中文乱码| 又黄又爽无遮挡免费视频| 一级女人18片毛片免费视频| 国产成人综合亚洲AV第一页 | 亚洲高清免费在线观看| 免费观看四虎精品成人| 亚洲高清国产拍精品青青草原| 免费在线观看自拍性爱视频| 亚洲一级片免费看| 中文字幕一区二区免费| 国产成人3p视频免费观看| 麻豆亚洲AV成人无码久久精品| 俄罗斯极品美女毛片免费播放| 一区二区三区免费精品视频| 亚洲av丰满熟妇在线播放| 成年免费大片黄在线观看岛国| 国产亚洲一卡2卡3卡4卡新区| 国产自偷亚洲精品页65页| 久久免费观看国产精品| 亚洲一区爱区精品无码| 久久久免费精品re6| 久久99国产亚洲精品观看| 国产精品成人观看视频免费| 亚洲AV日韩AV一区二区三曲| 久久久久亚洲AV综合波多野结衣| 久久国产乱子伦精品免费不卡| 亚洲综合国产成人丁香五月激情| 亚洲欧洲中文日韩av乱码| 日本免费xxxx| 乱淫片免费影院观看|