Java如何实现字符串池?

我想更深入地理解字符串池。 请帮助我在Java中获取包含此实现的源类文件。

问题更多的是找到源代码或字符串池的实现,以深入研究这个概念,以更多地了解其中的一些未知或难以捉摸的事物。 通过这种方式,我们可以更有效地使用字符串,或者想一些其他方法来实现我们自己的垃圾收集,以防我们有一个应用程序创建了这么多的文字和字符串对象。

很抱歉让你失望,但是Java String-Pool不是一个真正的Java类,而是在JVM中实现的某个地方,即它是作为C ++代码编写的。 如果查看String类的源代码 (几乎一直向下),您会看到intern()方法是本机的。 您将不得不通过一些JVM代码来获取更多信息。

编辑:可以在这里找到一些实现( C ++标头 , C ++实现 )。 搜索StringTable

Edit2:正如Holger在评论中指出的那样,这不是JVM实现的硬性要求。 因此,可以使用以不同方式实现字符串池的JVM,例如使用实际的Java类。 虽然我所知道的所有常用JVM都是在JVM C ++代码中实现的。

你可以阅读这篇文章: 字符串,字面意思

当.java文件编译成.class文件时,任何字符串文字都以特殊方式记录,就像所有常量一样。 加载类时(注意在初始化之前加载),JVM会遍历类的代码并查找String文字。 当找到一个时,它会检查是否已从堆中引用了等效的String。 如果没有,它会在堆上创建一个String实例,并在常量表中存储对该对象的引用。 一旦对该String对象进行了引用,整个程序中对该String字符的任何引用都将被替换为对String Literal Pool引用的对象的引用。

因此,在上面显示的示例中,String Literal Pool中只有一个条目,它将引用包含单词“someString”的String对象。 将为两个局部变量(一个和两个)分配对该单个String对象的引用。 通过查看上述程序的输出,您可以看到这是真的。 当equals()方法检查String对象是否包含相同的数据(“someString”)时,==运算符在对象上使用时会检查引用相等性 – 这意味着它将返回true,当且仅当两个引用变量指的是完全相同的对象。 在这种情况下,引用是相同的。 从上面的输出中,您可以看到局部变量one和two不仅引用包含相同数据的字符串,它们引用同一个对象。