我想更深入地理解字符串池.请帮助我在Java中获取包含此实现的源类文件.
问题更多的是找到源代码或字符串池的实现,以深入研究这个概念,以更多地了解其中的一些未知或难以捉摸的事物.通过这种方式,我们可以更有效地使用字符串,或者考虑使用其他方法来实现我们自己的垃圾收集,以防我们有一个应用程序创建了如此多的文字和字符串对象.
Mar*_*inS 18
很抱歉让你失望,但是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 Literal Pool引用的对象的引用.
因此,在上面显示的示例中,String Literal Pool中只有一个条目,它将引用包含单词"someString"的String对象.将为两个局部变量(一个和两个)分配对该单个String对象的引用.通过查看上述程序的输出,您可以看到这是真的.当equals()方法检查String对象是否包含相同的数据("someString")时,==运算符在对象上使用时会检查引用相等性 - 这意味着它将返回true,当且仅当两个引用变量指的是完全相同的对象.在这种情况下,引用是相同的.从上面的输出中,您可以看到局部变量one和two不仅引用包含相同数据的字符串,它们引用同一个对象.