Home Articles

Java如何实现字符串池? [重复]

Asked
Viewed 702 times
8

这个问题在这里已有答案:

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

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

2 Answers

  • 18

    你可以浏览这篇文章:Strings, Literally

    当.java文件编译成.class文件时,任何字符串文字都以特殊方式记录,就像所有常量一样 . 加载类时(注意在初始化之前加载),JVM会遍历类的代码并查找String文字 . 当找到一个时,它会检查是否已从堆中引用了等效的String . 如果没有,它会在堆上创建一个String实例,并在常量表中存储对该对象的引用 . 一旦对该String对象进行了引用,整个程序中对该字符串文字的任何引用都将简单地替换为对String Literal Pool引用的对象的引用 . 因此,在上面显示的示例中,String Literal Pool中只有一个条目,它将引用包含单词“someString”的String对象 . 将为两个局部变量(一个和两个)分配对该单个String对象的引用 . 通过查看上述程序的输出,您可以看到这是真的 . 当equals()方法检查String对象是否包含相同的数据(“someString”)时,==运算符在对象上使用时会检查引用相等性 - 这意味着它将返回true,当且仅当两个引用变量指的是完全相同的对象 . 在这种情况下,引用是相同的 . 从上面的输出中,您可以看到局部变量one和two不仅引用包含相同数据的字符串,它们引用同一个对象 .

  • 5

    我很抱歉让你失望,但Java String-Pool不是一个真正的Java类,而是在JVM中实现的某个地方,即它被写为C代码 . 如果您查看source code of the String class(几乎一直向下),您会看到 intern() 方法是原生的 . 您将不得不通过一些JVM代码来获取更多信息 .

    编辑:可以在此处找到一些实现(C++ headerC++ implementation) . 搜索 StringTable .

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

Related