String 的所有操作都不是更改对象本身,而是返回了新的字符串;就是说,replaceAll之前和之后不是一个对象了!
==================
其实 【遗忘99】 说的有点过了。你现在不要理会网上争论的字符串常量池问题,所有关于几个String对象的问题,都暂时不要理会;JVM不同,其实结论是不同的。而且他说的那个列子,几乎所有现代JVM,都生成2个对象:"abc" 和 "abcabc",不是3个。
总之你记得:两个拼写不一样的String ,一定是不同的对象;两个拼写一样的String,也可能是不同的对象
==================
再给你个例子,跑跑看,根据结果自己想想,很容易就明白了:
String a = "ABC";
String anotherA = a.replaceAll("A", "B");
System.out.println(a);
System.out.println(anotherA);
System.out.println(a==anotherA);
StringBuffer b = new StringBuffer("ABC");
StringBuffer anotherB = b.replace(0, 1, "B");
System.out.println(b);
System.out.println(anotherB);
System.out.println(b==anotherB);
这是说字符串的“不可改变”是字符串池,例如,
String str1 = "abc";
String str2 = "abc";
str1 += str2; //new obj
现在有了三个对象。
像你说的relpaceAll方法,最终是创建一个新对象,而原理的对象是不变的。
在实用中:
String 的改变会改变存放这个数据的物理地址,如果程序中需要频繁得改变某一个String变量的话效率很低
StringBuffer如果改变而导致原来的物理地址不够用的时候,会延伸物理地址,相对String的改变更为方便
我曾经做过类似的东西,不断的往一个String中增加新的字符串,大约一万个,用String要运行1分钟多,用StringBuffer只要1秒
再说,replaceAll()不是对String进行修改,是生成新的String,这样用:
String a = "123";String b = "";b = a.replaceAll("1","3");
得到结果是 b是323, a还是那个123
建议楼主去看下源码,就啥都明白了