一直在想String类的实体是一个常量,为什么却可以对它进行修改呢
例如代码:
public class Test {
public static void main(String[] args) {
String str="aaa";
str+="bbb";
System.out.println(str);
}
}
这里str的实体是"aaa",已经不能变了,但对它进行“+=”操作修改变为了"aaabbb",这不就是改变了吗?
其实不然,这里陷入了一个误区,就是 str+"bbb" 不是扩展,而是重新开辟空间
我们知道,String类对象的引用值可以改变,也就是说形如:
String s="hello";
s="world";
虽然s的内容不能改变,但是可以改变引用的值,使这个对象指向其他字符串常量。
回过头来,最上面的例子中,str在栈区相当于一个指针,其实体首先为"aaa","aaa"在堆区是一个常量 "bbb"也是一个常量在堆区,
"aaa"+"bbb"这个操作不是在"aaa"所在内存区域的后面插入"bbb",而是重新创建一段空间,再把"aaa"和"bbb"都放进来
所以str+="bbb" 实际上是str指向了新创建的"aaabbb"内存的区域,而以前的"aaa"、"bbb"两个空间还保留,等待JVM的垃圾回收程序GC回收。
所以说String类的对象的内容不可更改,但可以更改的是对象的引用。 字符串 String类之间使用'+'来操作是重新分配空间,而不是扩展。