Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎
          問題:在String對象中有個構(gòu)造函數(shù)是直接接受StringBuffer的。程序如下:

          public String (StringBuffer buffer) {
          synchronized(buffer) {
          buffer.setShared();
          this.value = buffer.getValue();
          this.offset = 0;
          this.count = buffer.length();
          }
          }


          在StringBuffer中:

          final char[] getValue() { return value; }


          很明顯的,這個構(gòu)造函數(shù)直接把StringBuffer的char[]數(shù)組返回給了String對象。也就是現(xiàn)在新生成的String和StringBuffer共用同一個char[]數(shù)組,但是下面的程序為什么會打印出以下結(jié)果呢:

          StringBuffer sb = new StringBuffer("abc");
          System.out.println("StringBuffer: " + sb.toString());
          String s = new String(sb);
          System.out.println("String: " + s);
          sb.append("123");
          System.out.println("StringBuffer: " + sb);
          System.out.println("String: " + s);
          /////////////////////////////////////////////////////////////////////
          StringBuffer: abc
          String: abc
          StringBuffer: abc123
          String: abc


          分析:這個問題的核心答案在 this.count = buffer.length() 這句話上。這句話的意思是String中的count的大小為這個char[]數(shù)組中實際含有的字符的個數(shù),而不是這個數(shù)組的大小。所以在打印的時候?qū)τ谏厦娴腟tring對象,只會打印3個字符,而不是6個字符!

          新的問題:如果我從StringBuffer中刪除了一個字符,那么String對象也應(yīng)該受到影響了?但是為什么實際上這個String沒有發(fā)生變化呢?問題的答案在buffer.setShared()上,這句話的含義就是告訴這個StringBuffer,有其它的String對象與它共享它的char[]數(shù)組。

          這個時候,當(dāng)它進(jìn)行delete,insert等操作的時候,它會新生成一個char[]數(shù)組,然后再進(jìn)行操作。所以這個時候String和StringBuffer就不共享同一個數(shù)組了,String自然也就不會受到影響了。

          為什么要用這么復(fù)雜的方法呢?答案是“節(jié)省內(nèi)存資源”??梢韵胂?,我們在程序中使用最頻繁的對象都有哪些,答案肯定包含String。而我們知道,在拼裝一個String的時候,使用StringBuffer效率最高。所以我們會先用StringBuffer動態(tài)的拼裝好一個字符串,然后再把它轉(zhuǎn)化成String對象,這個時候就會突顯這種方式的經(jīng)典之處了。下面是StringBuffer的toString()方法:

          public String toString() {
          return new String(this);
          }


          public String (StringBuffer buffer) {
          synchronized(buffer) {
          buffer.setShared();
          this.value = buffer.getValue();
          this.offset = 0;
          this.count = buffer.length();
          }
          }


          在StringBuffer中:

          final char[] getValue() { return value; }


          很明顯的,這個構(gòu)造函數(shù)直接把StringBuffer的char[]數(shù)組返回給了String對象。也就是現(xiàn)在新生成的String和StringBuffer共用同一個char[]數(shù)組,但是下面的程序為什么會打印出以下結(jié)果呢:

          StringBuffer sb = new StringBuffer("abc");
          System.out.println("StringBuffer: " + sb.toString());
          String s = new String(sb);
          System.out.println("String: " + s);
          sb.append("123");
          System.out.println("StringBuffer: " + sb);
          System.out.println("String: " + s);
          /////////////////////////////////////////////////////////////////////
          StringBuffer: abc
          String: abc
          StringBuffer: abc123
          String: abc


          分析:這個問題的核心答案在 this.count = buffer.length() 這句話上。這句話的意思是String中的count的大小為這個char[]數(shù)組中實際含有的字符的個數(shù),而不是這個數(shù)組的大小。所以在打印的時候?qū)τ谏厦娴腟tring對象,只會打印3個字符,而不是6個字符!

          新的問題:如果我從StringBuffer中刪除了一個字符,那么String對象也應(yīng)該受到影響了?但是為什么實際上這個String沒有發(fā)生變化呢?問題的答案在buffer.setShared()上,這句話的含義就是告訴這個StringBuffer,有其它的String對象與它共享它的char[]數(shù)組。

          這個時候,當(dāng)它進(jìn)行delete,insert等操作的時候,它會新生成一個char[]數(shù)組,然后再進(jìn)行操作。所以這個時候String和StringBuffer就不共享同一個數(shù)組了,String自然也就不會受到影響了。

          為什么要用這么復(fù)雜的方法呢?答案是“節(jié)省內(nèi)存資源”??梢韵胂?,我們在程序中使用最頻繁的對象都有哪些,答案肯定包含String。而我們知道,在拼裝一個String的時候,使用StringBuffer效率最高。所以我們會先用StringBuffer動態(tài)的拼裝好一個字符串,然后再把它轉(zhuǎn)化成String對象,這個時候就會突顯這種方式的經(jīng)典之處了。下面是StringBuffer的toString()方法:

          public String toString() {
          return new String(this);
          }

          ]]>
          posted on 2005-09-20 14:28 Sung 閱讀(161) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 绍兴县| 大余县| 尼木县| 宝鸡市| 龙游县| 涡阳县| 福泉市| 甘孜县| 铜梁县| 梁山县| 九江市| 巴林左旗| 民权县| 公主岭市| 双江| 马尔康县| 台前县| 兴城市| 江口县| 驻马店市| 新民市| 渑池县| 怀仁县| 花垣县| 洛川县| 磐石市| 湘阴县| 甘泉县| 莫力| 景德镇市| 东乌| 垣曲县| 杨浦区| 九江县| 奉贤区| 页游| 青海省| 昌都县| 东阿县| 克山县| 桃园县|