关于String对象不可改变的解释
最开始学String类这个相关知识点的时候,大家都听说过,String对象所指向的字符串内容不能改变
注意,这让人迷惑的地方,,,啥,,,内容不可以改变,,,,
然后我写了
public class G {
public static void main(String[] args) {
String str1 = "xiaoMing";
String str2 = str1;
System.out.println(str1);
System.out.println(str2);
System.out.println("------改变str11、str22----------");
String str11 = "zhsangSan";
String str22 = str1;
str22 = "laOFuZi";
str11 = "KKKK";
System.out.println(str11);
System.out.println(str22);
}
}
xiaoMing
xiaoMing
------改变str11、str22----------
KKKK
laOFuZi
Process finished with exit code 0
说好的内容不可以改变呢,,,咋运行结果与理论不一样
所以:
一个String对象在 堆内存 中创建以后, 就不能被改变了.
其实String对象的所有方法都不会改变其本身,而是会返回一个新的String对象.(比如字符串的concat
方法做为连接方法使用,使用后它返回的是一个新的String对象)
需要可改变的字符串,则需要使用 StringBuffer 或者 StringBuilder.
否则每次创建一个新String对象的话,就会造成大量的内存浪费,需要耗时来执行垃圾回收。这里的zhsanSan就需要靠垃圾回收机制来回收了
public class G {
public static void main(String[] args) {
StringBuffer str1 = new StringBuffer("abc");
StringBuffer str2 = str1;
str2.append("changed");
System.out.println(str1);
System.out.println(str2);
}
}
abcchanged
abcchanged
Process finished with exit code 0
执行str1 = str2时候,str1与str2指向同一字符串,即内存中同一个位置,所以当改变str2时候str1也会发生改变
所以StringBuffer对象遵循对象的引用规则,其内容是可变的,String对象的内容是不可变的