String a = "hello"; System.out.println(a); a = " world!!!"; System.out.println(a);
输出一个是 hello 一个world!!! 为什么说String 是不可变的。
这个解释起来有点复杂,要从编程语言对应的内存来讲解了。
代码是Java,Java内存管理有“程序计数器,虚拟机栈,Native方法栈,Java堆,方法区”五个区域
也就是说所有代码,将会被解析到这五个区域中。
-----------这和我的问题有什么联系呢?-------------
等号左面的数据存放在栈区,右边的数据存放在堆区。
-----------再看一下你的代码---------------------
a存放在栈区,“hello“存放在堆区。也就是说,a和“hello”,是存放在两个区域的两个变量。
=是他们的“关系”。而不是说,a与“hello”是一个变量,他们依然在两个区域独立,。
在a=“world”时,“world”在堆区新生成,此时“hello”不变。
a此时依然在栈区,a与“world”有了=关系,此时“hello”依然存在,但是没有任何栈区变量与它“有关”
则“hello”的内存空间会被JVM在下一次GC(垃圾清理)时回收
不是说“hello”变了,而是有了新的“world”。
-----------最后打个比方------------------------
“a“是个妹子,有了男友“hello”
后来“a”有了新男友“world”
但是“hello”,没有变成“world”,因为他们根本上是两个人。
相似问题