Jit*_*esh 9 java oop string heap immutability
据我所知,如果使用文字初始化String,则会在String Pool中分配一个空格,如果使用新的Keyword初始化,则会创建String的对象.但我对下面写的案例感到困惑.
我的问题是,如果使用new关键字创建String,然后使用文字更新值?
例如
String s = new String("Value1"); -- Creates a new object in heap space
Run Code Online (Sandbox Code Playgroud)
那么如果写下面的语句怎么办呢.
s = "value2";
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,
1它是否会在字符串池中创建字符串文字,还是会更新该对象的值?
2如果它在字符串池中创建一个新文字,那么当前存在的对象会发生什么?是否会被破坏,或者它会在那里被调用垃圾收集器.
这是一个小字符串,如果字符串是成千上万的字符,那么我只是担心它使用的空间.所以我的关键问题是空间.
在分配文字后,它会立即从堆中释放空间吗?
任何人都可以解释从第一个语句到第二个语句的值是什么,以及内存区域(堆和字符串池)会发生什么.
Strings运行时不会更新该值
s = "value2";
Run Code Online (Sandbox Code Playgroud)
在Java中,除了基本类型之外,所有其他变量都是对象的引用.这意味着只s指向一个新值.
不变性保证了物体的状态在施工后不会改变.换句话说,没有办法修改StringJava 中任何对象的内容.例如,如果您s = s+"a";创建了一个新字符串,则以某种方式存储新文本.
这个答案已经提供了一个深入的答案.如果您不想阅读完整的答案,请在简短的摘要下面,但它省略了一些细节.
默认情况下,new String(...)对象不会被实现,因此适用垃圾收集的常规规则.这些只是普通的物体.
您的代码中的常量字符串通常永远不会被删除,因为最终您可能会引用这些字符串.
然而,在答案中有一个侧面说明,有时类动态(un)加载,在这种情况下,文字可以从池中删除.
要回答您的其他问题:
在分配文字后,它会立即从堆中释放空间吗?
不,这不会真正有效:垃圾收集器需要分析要删除的对象.您可能与其他对象共享对旧字符串的引用,因此无法保证可以回收该对象.此外,只要您不需要向操作系统请求额外的内存(将其与您的计算机进行比较,只要您可以将所有数据存储在硬盘驱动器上),存储数据不再有用就没有太大问题. ,你真的不必担心无用的文件,从你需要购买额外的驱动器的那一刻起,你可能会先尝试删除一些文件).分析需要一些计算工作.通常,垃圾收集器仅在(几乎)耗尽内存时运行.所以你不应该'
任何人都可以解释从第一个语句到第二个语句的值是什么,以及内存区域(堆和字符串池)会发生什么.
你的第一个字符串
String s = new String("Value1");
Run Code Online (Sandbox Code Playgroud)
是对堆的引用.如果调用该命令,它将在堆上为该字符串分配空间.
现在,如果你打电话:
s = "value2";
Run Code Online (Sandbox Code Playgroud)
"value2"是字符串池的一个元素,它将一直保持在那里,直到你的程序结束.
由于您没有对旧字符串(value1)的引用,因此.该对象是收集的候选对象.如果垃圾收集器稍后走过,它将从堆中删除该对象并将该空间标记为空闲.
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |