熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

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

2013-11-23 19:01:25  來源: Java核心技術 

  在String對象中有個構造函數是直接接受StringBuffer的程序如下
  
  public String (StringBuffer buffer) {
  synchronized(buffer) {
  buffersetShared();
  thisvalue = buffergetValue();
  thisoffset = ;
  unt = bufferlength();
  }
  }
  
  在StringBuffer中
  
  final char[] getValue() { return value; }
  
  很明顯的這個構造函數直接把StringBuffer的char[]數組返回給了String對象也就是現在新生成的String和StringBuffer共用同一個char[]數組但是下面的程序為什麼會打印出以下結果呢
  
  StringBuffer sb = new StringBuffer(abc);
  Systemoutprintln(StringBuffer: + sbtoString());
  String s = new String(sb);
  Systemoutprintln(String: + s);
  sbappend();
  Systemoutprintln(StringBuffer: + sb);
  Systemoutprintln(String: + s);
  /////////////////////////////////////////////////////////////////////
  StringBuffer: abc
  String: abc
  StringBuffer: abc
  String: abc
  
  分析這個問題的核心答案在 unt = bufferlength() 這句話上這句話的意思是String中的count的大小為這個char[]數組中實際含有的字符的個數而不是這個數組的大小所以在打印的時候對於上面的String對象只會打印個字符而不是六個字符!!
  
  新的問題如果我從StringBuffer中刪除了一個字符那麼String對象也應該受到影響了?但是為什麼實際上這個String沒有發生變化呢?問題的答案在buffersetShared()上這句話的含義就是告訴這個StringBuffer有其它的String對象與它共享它的char[]數組這個時候當它進行deleteinsert等操作的時候它會新生成一個char[]數組然後再進行操作所以這個時候String和StringBuffer就不共享同一個數組了String自然也就不會受到影響了
  
  為什麼要用這麼復雜的方法呢?答案是節省內存資源可以想想我們在程序中使用最頻繁的對象都有哪些?答案肯定包含String而我們知道在拼裝一個String的時候使用StringBuffer效率最高所以我們會先用StringBuffer動態的拼裝好一個字符串然後再把它轉化成String對象這個時候就會突顯這種方式的經典之處了下面是StringBuffer的toString()方法
  
  public String toString() {
  return new String(this);
  }

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26156.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.