问题描述
看了一些JAVA引用,CLONE,看了有点然后看底下StringBuffer 和 String public static void main(String[] args){ Hashtable ht = new Hashtable();// StringBuffer sb = new StringBuffer();// sb.append("abc,");// ht.put("1",sb); // sb.append("def,");// ht.put("2",sb);// sb.append("mno,");// ht.put("3",sb);// sb.append("xyz.");// ht.put("4",sb); String sb = ""; sb+= "abc"; ht.put("1",sb); sb+="def"; ht.put("2",sb); sb+="ghi"; ht.put("3",sb); sb+="xyz"; ht.put("4",sb); int numObj=0; Enumeration it = ht.elements(); while(it.hasMoreElements()){ System.out.print("get StringBufffer "+(++numObj)+" from Hashtable: "); System.out.println(it.nextElement()); } }上下2个方法,StringBuffer和String都是对象,如果按传递的都是地址来说,答案应该都一样上面运行get StringBufffer 1 from Hashtable: abc,def,mno,xyz.get StringBufffer 2 from Hashtable: abc,def,mno,xyz.get StringBufffer 3 from Hashtable: abc,def,mno,xyz.get StringBufffer 4 from Hashtable: abc,def,mno,xyz.下面get StringBufffer 1 from Hashtable: abcdefghixyzget StringBufffer 2 from Hashtable: abcdefghiget StringBufffer 3 from Hashtable: abcdefget StringBufffer 4 from Hashtable: abc
解决方案
String是一个final修饰的类.这就证明它是不可改变的.所以生成的String对象也是不可改变的.你所看到的String的连接操作.String str = "abc";sb+= "def"; 实际上是先生成了一个名为str的String引用,指向了"abc"这个字符串对象.sb+= "def";就是生成了一个"abc"对象.然后将"def"与"abc"两个对象连接的值"abcdef",生成一个新的String对象.再让str指向新生成的String对象.所以String每次进行+=操作,都会新生成一个String的对象.由于StringBuffer不是final修饰的,所以StringBuffer的引用对象值可以直接改变.所以每次操作,都是同一个对象.对于为何String修饰为final,楼主可以自己去搜一下相关的资料.
解决方案二:
请看臧圩人几篇blog:1, JAVA面试题解惑系列(二)——到底创建了几个String对象?http://zangweiren.iteye.com/blog/2098952, JAVA面试题解惑系列(五)——传了值还是传了引用?http://zangweiren.iteye.com/blog/2143693, JAVA面试题解惑系列(六)——字符串(String)杂谈http://zangweiren.iteye.com/blog/216005自然就可以找到答案.