关于String池的一些困惑

时间:2012-06-24 06:24:53

标签: java

java docs说:

  

一个字符串池,最初是空的,由私有维护   class String。

1)这些字符串文字是string literals还是references的汇集?在网上有些文章将它称为字符串文字池,而其他文章将其称为引用池,所以我感到困惑。

2)是否按类或每个JVM创建字符串池?

3)是否有任何参考我可以找到字符串池的详细信息,其实现等。

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

  1. 这是一个字符串文字池
  2. 实习是在JVM基础上完成的
  3. String的JDK源代码中包含所有代码