国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

問題解決分析:String Buffer的小問題

2019-11-18 11:59:35
字體:
來源:轉載
供稿:網友

  在String對象中有個構造函數是直接接受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; }
  
  很明顯的,這個構造函數直接把StringBuffer的char[]數組返回給了String對象。也就是現在新生成的String和StringBuffer共用同一個char[]數組,但是下面的程序為什么會打印出以下結果呢:
  
  StringBuffer sb = new StringBuffer("abc");
  System.out.  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[]數組中實際含有的字符的個數,而不是這個數組的大小。所以在打印的時候對于上面的String對象,只會打印3個字符,而不是六個字符!!
  
  新的問題:假如我從StringBuffer中刪除了一個字符,那么String對象也應該受到影響了?但是為什么實際上這個String沒有發生變化呢?問題的答案在buffer.setShared()上,這句話的含義就是告訴這個StringBuffer,有其它的String對象與它共享它的char[]數組。這個時候,當它進行delete,insert等操作的時候,它會新生成一個char[]數組,然后再進行操作。所以這個時候String和StringBuffer就不共享同一個數組了,String自然也就不會受到影響了。
  
  為什么要用這么復雜的方法呢?答案是“節省內存資源”。可以想想,我們在程序中使用最頻繁的對象都有哪些?答案肯定包含String。而我們知道,在拼裝一個String的時候,使用StringBuffer效率最高。所以我們會先用StringBuffer動態的拼裝好一個字符串,然后再把它轉化成String對象,這個時候就會突顯這種方式的經典之處了。下面是StringBuffer的toString()方法:
  
  public String toString() {
  return new String(this);
  }

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天峻县| 阿鲁科尔沁旗| 松潘县| 蕉岭县| 海淀区| 林口县| 连平县| 青州市| 江北区| 娱乐| 汤原县| 漳平市| 宝鸡市| 广宗县| 金门县| 扎鲁特旗| 南郑县| 隆回县| 五河县| 同江市| 花垣县| 洪江市| 石景山区| 营口市| 大理市| 德惠市| 临沭县| 鹤庆县| 慈溪市| 荆州市| 南充市| 龙陵县| 六枝特区| 威远县| 虞城县| 长海县| 祁阳县| 临猗县| 稻城县| 舟山市| 双流县|