gpt4 book ai didi

Java 字符串文字池和字符串对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:28:39 25 4
gpt4 key购买 nike

我知道JVM维护一个字符串字面量池来提高性能和维护JVM内存,了解到字符串字面量是在字符串池中维护的。但是我想澄清一些与在堆上创建的字符串池和字符串对象有关的事情。

如果我的解释有误,请指正。

String s = "abc";

如果执行上述行,如果池中不存在“abc”字符串文字,则将其添加到字符串池中。并且在堆上创建字符串对象,引用 s 将指向池中的文字。

问题:

  1. 这段代码是否每次执行都会在堆上创建字符串对象?
  2. 字符串文字池是只维护字符串文字还是同时维护字符串对象?
  3. JVM 何时决定它需要将字符串文字添加到字符串池中?它决定在编译时还是运行时?

如果字符串对象指向池中的字符串字面值,我不确定到底在哪里创建字符串对象。

谢谢。

最佳答案

没有“文字池”。 Interned Strings 只是普通的堆对象。它们可能最终进入 PermGen,但即便如此,它们最终也可能被垃圾回收。

类文件有一个常量池,其中包含类中使用的字符串字面量。加载类时,会根据该数据创建 String 对象,这可能与 String#intern 所做的非常相似。

Does this code create string object on the heap every time it is executed?

没有。将有一个 String 对象被重用。它是在加载类时创建的。

Does string literal pool maintain only string literals or does it maintain string object as well?

您也可以实习字符串。我假设他们或多或少受到相同的对待。

When does JVM decide that it needs to add string literal to the string pool? does it decide in the compile time or runtime?

文字总是被“合并”。其他字符串需要调用“实习生”。所以在某种程度上,决定是在编译时做出的。

关于Java 字符串文字池和字符串对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8046045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com