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

标签 java string

我知道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/

相关文章:

链表中的Java算法

java - 实用程序库的日志记录标准

delphi - D2009 TStringlist ansisstring

java - 人们关于某个主题的推文频率如何?

java - IntelliJ - 如何运行当前程序而不管不相关文件中的错误

java - 我可以为数据库表主键设置一个 MAX 值吗?

Python 2.6 如何将此字符串转换为字典?

c - 使用 C 中的排序字典对字符串进行拼写检查

python - 为什么 re.findall 匹配字符串,但没有正确返回结果?

c - 为什么我会遇到段错误(strcmp 或 fgets)?