java docs说:
一个字符串池,最初是空的,由私有维护 class String。
1)这些字符串文字是string literals
还是references
的汇集?在网上有些文章将它称为字符串文字池,而其他文章将其称为引用池,所以我感到困惑。
2)是否按类或每个JVM创建字符串池?
3)是否有任何参考我可以找到字符串池的详细信息,其实现等。
答案 0 :(得分:4)
1)它是一个字符串文字池还是对这些字符串文字的引用?在网上有些文章将它称为字符串文字池,而其他文章将其称为引用池,所以我感到困惑。
这是一回事。没有引用就不能有String对象,反之亦然。
并且正如Peter Lawrey所说的那样:“在Java中,一个对象在堆内。没有其他地方。你可以在其他内容,对象,数组,集合或堆栈中唯一拥有的东西,是对该对象的引用。“
2)是否按类或每个JVM创建字符串池?
每个JVM有一个字符串池...除非你使用一些奇特的JVM,他们决定以不同的方式实现它。 (规范并未说明必须为JVM提供一个字符串池,但这通常是最有效的方法。)
3)是否有任何参考我可以找到字符串池的详细信息,其实现等。
您可以下载OpenJDK 6或7的完整源代码。弹簧池以本机代码实现...所以您将阅读C ++。
答案 1 :(得分:1)
Is it a pool of string literals or references to these string literals?.
好吧,显然它是字符串文字池。假设你写,
String str= "a learner";
它将通过equals()方法在String池中搜索字符串池中是否存在相同的字符串。如果它存在于Pool中,则返回该String对象,否则它将存储在String Pool中并引用返回新添加的字符串。
因此,它是String对象的池,每当您键入新的字符串文字时,都会调用equals()方法。
Is string pool created per class basis or per JVM basis?
JVM中只能有一个String类,因为String类是final。因此,每个JVM不存在多个String类的问题。最终,每个JVM只有一个字符串池。
答案 2 :(得分:0)
它被称为String interning。