更改String对象时的Java String Immutability存储

Java String Immutability storage when String object is changed

我知道,如果一个字符串是用文字初始化的,那么它将在字符串池中分配一个空间;如果用新关键字初始化,它将创建一个字符串的对象。但我对下面写的一个案例感到困惑。

我的问题是,如果一个字符串是用新关键字创建的,然后它的值是用文字更新的,那该怎么办?

例如。

1
String s = new String("Value1");  -- Creates a new object in heap space

然后写下下面的语句。

1
s ="value2";

所以我的问题是,

1它是在字符串池中创建字符串文字,还是更新该对象的值?

2如果它在字符串池中创建了一个新的文本,那么当前存在的对象会发生什么情况?它会被销毁还是会一直存在,直到调用垃圾收集器为止。

这是一个小字符串,如果字符串是由数千个字符组成的,那么我只是担心它使用的空间。所以我的关键问题是空间。

在分配文本之后,它会立即从堆中释放空间吗?

任何人都能解释从第一个语句到第二个语句的值在哪里,以及内存区域(堆和字符串池)将发生什么情况吗?


修改Strings

运行时不更新该值

1
s ="value2";

在爪哇中,除了原始类型之外,所有其他变量都是对象的引用。这意味着只有EDOCX1[1]指向一个新值。

不变性保证了对象的状态在构造后不能更改。换句话说,没有任何方法可以修改Java中任何EDCOX1×0对象的内容。例如,如果您已经创建了一个新的字符串,它以某种方式存储了新的文本。

垃圾收集

这个答案已经提供了一个深入的答案。下面是一个简短的总结,如果你不想阅读完整的答案,但它省略了一些细节。

默认情况下,new String(...)对象不被拘禁,因此适用于垃圾收集的常规规则。这些只是普通的物品。

代码中的常量字符串(在内部)通常不会被删除,因为最终可能会引用这些字符串。

不过,答案中有一个附带说明,即有时类是动态(非)加载的,在这种情况下,可以从池中删除文本。

要回答您的其他问题:

Will it immediately free the space from the heap after assigning the literal?

不,这不是真正有效的:垃圾收集器需要对要删除的对象进行分析。您可能与其他对象共享了对旧字符串的引用,因此不能保证您可以回收该对象。此外,存储不再有用的数据没有太大的错误,只要您不需要向操作系统请求额外的内存(与您的计算机比较,只要您可以将所有数据存储在硬盘上,就不必担心无用的文件,从您需要购买额外的DRI的那一刻起。ve,您可能会先尝试删除一些文件)。分析需要一些计算工作。一般来说,垃圾收集器只有在它(几乎)耗尽内存时才运行。所以你不应该太担心记忆。

Can anyone explain what what value goes where from the first statement to the second and what will happened to the memory area (heap and String Pool).

您的第一个字符串:

1
String s = new String("Value1");

是对堆的引用。如果调用该命令,它将在堆上为字符串分配空间。

现在,如果您致电:

1
s ="value2";

"value2"是字符串池的一个元素,它将一直保留到程序结束。

因为您不再有对旧字符串的引用(value1)。该对象是集合的候选对象。如果垃圾收集器稍后路过,它将从堆中移除对象并将空间标记为可用。


If you need to change a string, you can always create a new one that contains
the modifications.

  • Java定义了一个字符串的对等类,称为String缓冲区,它允许字符串被更改。