看了一些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: abcdefghixyz
get StringBufffer 2 from Hashtable: abcdefghi
get StringBufffer 3 from Hashtable: abcdef
get 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对象?[url]http://zangweiren.iteye.com/blog/209895[/url]
2, JAVA面试题解惑系列(五)——传了值还是传了引用?[url]http://zangweiren.iteye.com/blog/214369[/url]
3, JAVA面试题解惑系列(六)——字符串(String)杂谈[url]http://zangweiren.iteye.com/blog/216005[/url]
自然就可以找到答案.