我来回答:
s2跟s1是共同有 一个 reference! 是 s1的别名,但是 楼主注意
s2=s2+"there";
它的意思是 字符串连接之后,把 新的连接后的字符串 地址 给s2!所以 此s2非
彼s2啦.
Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加(new String()时直接创建);
String的引用方式不同于一般的object,“hello”, String s2=s1,创建了一个引用s2,有了自己的memory space,对他的变更不会影响s1(这点更像基本类型)
s2=s1+"there"道理一样的,关于性能可以参见:http://wdmcln.javaeye.com/blog/136268