当前位置: 首页 > 知识库问答 >
问题:

字符串池-字符串是否总是存在于常量池中?

闻人冷勋
2023-03-14

当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。

但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?

共有1个答案

归翔
2023-03-14

术语:

>

字符串池是JVM用来管理特定类型字符串的运行时数据结构。(具体来说,String对应于文本的对象,以及String通过String::intern()添加到池中的对象)

你的问题实际上是在谈论字符串池,而不是常量池。

回答你的问题:

字符串池-字符串是否总是存在于常量池中?

不存在。使用new string()创建的字符串对象在字符串池或常量池中都不存在。

当使用文字创建字符串时,它会存储在池中。

它(已经!)存在常量池,并在字符串池中创建。(实际创建可以在类加载时进行,也可以在首次使用文本时进行。这取决于Java实现。)

但当使用new运算符创建字符串对象时,它会将对象存储在堆中。

对但是字符串池也是堆的一部分。就像我说的,它是一个数据结构,而不是一个存储区域。

(在过去,字符串池位于一个叫做PermGen堆的特殊堆中。但是PermGen被替换为其他东西(MetaSpace),字符串池也不使用...再也不用了。

但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?

这真是令人困惑。

所有字符串都表示为(a)堆中的String对象。甚至字符串池中的字符串。即使字符串池在PermGen。

所有无法访问的String对象都有资格进行垃圾收集。即使是字符串池中的字符串。甚至对于表示字符串文字的String对象。

但是...等等...所以字符串文字可以被垃圾收集吗?

是的。!如果表示字符串文字的String对象在运行时变得不可访问,则它有资格使用垃圾回收机制,就像任何其他String对象一样。

如果使用字符串文字的代码对象变得不可访问,则字符串文字可能变得不可访问。当类加载器变得不可访问时,这种情况就会发生。

是的,PermGen是垃圾收集的。至少从JDK 1.2开始。(IIRCJava1.0和1.1没有为PermGen堆实现GC。但那是很久以前就解决了。)

 类似资料:
  • 如这些问题中所述:问题1 在以下情况下,JVM将创建一个新的字符串对象,而不是使用字符串池中的现有对象: 然而,在阅读了下面两个类似的陈述之后,我有一个疑问。 从SCJP准备书: 当编译器遇到字符串文字时,它会检查池中是否已经存在相同的字符串。如果找到匹配项,对新文本的引用将指向现有的String,并且不会创建新的String文本对象。 来自JavaRanch: 在本例中,由于关键字“new”,我

  • 问题内容: 这与Java字符串常量池有关。在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中。我听说Java字符串将存储在Constant池中,并且不会被VM重新启动或加载了String Quits的ClassLoader破坏。 如果是这种情况,我的密码将存储在字符串池中。我非常关心这个问题。还有其他方法可以销毁这些文字或我可以做的其他任何事情。 请对此提出建议, 问候,阳光明媚。 问题

  • 本文向大家介绍Java中的字符串常量池是什么?,包括了Java中的字符串常量池是什么?的使用技巧和注意事项,需要的朋友参考一下 当您将字符串存储为 JVM会直接在一个单独的内存块(称为String常量池)中创建具有给定值的String对象。 每当我们尝试创建另一个String作为 JVM会验证String常量池中是否存在具有相同值的String对象,如果不是,JVM会创建新对象而不是创建新对象,而

  • 当使用关键字 new 创建字符串时,它使用采用 String 文本的构造函数创建新的 String 对象。我想知道在调用 String 构造函数之前,文本是否存储在常量池中。 我这么问的原因是,在《OCA Java SE 7程序员I认证指南》中,Mala Gupta写道: 她在第一行表示,new创建的String对象不会存储在常量池中。这很好,但不清楚的是,第一行构造函数中的字面“Summer”是

  • 每个人都知道这一点。Net framework字符串对象直接存储在堆内存中 我只是想弄清楚里面是否有保留的记忆。Net字符串框架。在java中,有一个为字符串保留的内存,称为SCMP(字符串常量内存池),在这里字符串被初始化和垃圾收集,就像堆内存中的其他对象一样。

  • 根据Java, 字符串存储在两个地方。字符串字面池和堆内存根据其创建。我需要知道,当字符串赋值到另一个字符串时,新创建的字符串将存储在哪里? 我对堆和字符串池中的字符串类型都进行了赋值操作。我得到了这样的结果。 但是当, 如果我这么做 同样地, 现在 以上是我在IDE上得到的输出。根据该输出,strNew的一个新引用对象在字符串池中创建,strNew的一个新引用对象在堆中创建。对吗?