【发布时间】:2023-03-06 11:58:01
【问题描述】:
我知道如果一个字符串是用文字初始化的,那么它会在字符串池中分配一个空间,如果用新的关键字初始化它会创建一个字符串的对象。但我对下面写的一个案例感到困惑。
我的问题是,如果使用 new 关键字创建字符串,然后使用文字更新它的值怎么办?
例如
String s = new String("Value1"); -- Creates a new object in heap space
那么如果写下一条语句如下。
s = "value2";
所以我的问题是,
1 它会在字符串池中创建字符串文字还是更新该对象的值?
2 如果它在字符串池中创建一个新的字面量,当前存在的对象会发生什么?它会被销毁还是会一直存在,直到调用垃圾收集器。
这是一个小字符串,如果字符串包含数千个字符,那么我只是担心它使用的空间。所以我的关键问题是空间。
在分配字面量后会立即从堆中释放空间吗?
谁能解释从第一个语句到第二个语句的值是什么以及内存区域(堆和字符串池)会发生什么。
【问题讨论】:
-
您问题的关键是 -
s不是对象。它是对对象的引用。您确实更改了引用,但您没有更改此处的任何对象。 -
还要注意,String 对象是不可变的。因此,您无法更新字符串对象的值(直接。反射可用于破坏不变性)。在您的特定情况下,只要
s重新分配,堆上的字符串“value1”就有资格进行 GC。当加载定义此文字的类的类加载器被 GC 时,字符串文字“Value1”将有资格进行 GC。 -
@DmitryZaitsev 但是根据我读到的参考资料,如果它是用新的关键字初始化的,它将在堆空间中创建一个对象。所以有一个空间被物体占据。那么当分配一个文字(不在堆空间中)时,该空间会发生什么。
-
我指的是存储在
s中的那个(通过new运算符显式创建的那个)。
标签: java oop heap-memory immutability string-pool