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