繁体   English   中英

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

[英]Java String Immutability storage when String object is changed

据我所知,如果使用文字初始化String,则会在String Pool中分配一个空格,如果使用新的Keyword初始化,则会创建String的对象。 但我对下面写的案例感到困惑。

我的问题是,如果使用new关键字创建String,然后使用文字更新值?

例如

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

那么如果写下面的语句怎么办呢?

s = "value2";

所以我的问题是,

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

2如果它在字符串池中创建一个新文字,那么当前存在的对象会发生什么? 是否会被破坏,或者它会在那里被调用垃圾收集器。

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

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

任何人都可以解释从第一个语句到第二个语句的值是什么,以及内存区域(堆和字符串池)会发生什么。

修改String

运行时不会更新

s = "value2";

在Java中,除了基本类型之外 ,所有其他变量都是对象的引用 这意味着只有s指向一个新值。

不变性保证了物体的状态在施工后不会改变 换句话说,没有办法在Java中修改任何String对象的内容。 例如,如果你说s = s+"a"; 你创建了一个新的字符串,以某种方式存储新的文本。

垃圾收集

这个答案已经提供了一个深入的答案。 如果您不想阅读完整的答案,请在简短的摘要下面,但它省略了一些细节。

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

您的代码中的常量字符串通常永远不会被删除,因为最终您可能会引用这些字符串。

然而,在答案中有一个侧面说明,有时类动态(un)加载,在这种情况下,文字可以从池中删除。


要回答您的其他问题:

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

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

任何人都可以解释从第一个语句到第二个语句的值是什么,以及内存区域(堆和字符串池)会发生什么。

你的第一个字符串

String s = new String("Value1");

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

现在,如果你打电话:

s = "value2";

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

由于您没有对旧字符串( value1 )的引用,因此。 该对象是收集的候选对象。 如果垃圾收集器稍后走过,它将从堆中删除该对象并将该空间标记为空闲。

如果需要更改字符串,则始终可以创建包含修改的新字符串。

  • Java定义了String的对等类,称为StringBuffer,它允许更改字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM