DANCE WITH JAVA

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

          常用鏈接

          統(tǒng)計

          積分與排名

          好友之家

          最新評論

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

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


          toString()
          方法

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

          public String toString() {

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

          }

          ?

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

          public String (StringBuffer buffer) {

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

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

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

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

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

          ??????? }

          ?}

          沒有重新 new 內存空間,是共享的,這個時候首先想到的問題,如果 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;

          }

          重新分配了內存空間

          ?

          再來看看 StringBuffer deleteCharAt

          public synchronized StringBuffer deleteCharAt( int index) {

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

          ??????? return this ;

          }

          ?

          ?

          ?

          ?

          ?

          ?

          ?

          有了繼承關系,先不管,繼續(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

          ?

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

          發(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)在可以大概做一下總結了:

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

          StirngBuffer 的一些方法是同步的

          ?

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

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

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

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

          ?

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

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

          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

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

          主站蜘蛛池模板: 中阳县| 吕梁市| 高邑县| 翼城县| 邮箱| 阿拉尔市| 丽江市| 永福县| 枣强县| 仪陇县| 顺义区| 永兴县| 泾川县| 安国市| 原阳县| 贺州市| 玉门市| 琼结县| 福海县| 秦安县| 红桥区| 临洮县| 镇坪县| 吴旗县| 韶山市| 肥西县| 凉城县| 武山县| 兰考县| 鹤岗市| 旬邑县| 黄冈市| 呼和浩特市| 长宁区| 葵青区| 卫辉市| 黄龙县| 石景山区| 西林县| 克拉玛依市| 海口市|