如何在java中实现字符串池?

时间:2017-11-26 16:42:54

标签: java string

我知道将此问题标记为重复/近距离投票非常诱人,但请听我说。

我试图了解字符串池如何在Java中工作。

虽然StackOverflow中有很多关于同一主题的答案,但没有一个答案似乎能够详细解释实施细节。
信息在几十个问题上是分散的,每个问题似乎都指出其他一些答案是重复的,有些答案甚至看似与其他答案相矛盾。

这个问题的目的是为后代提供一个适当的,完整的答案,而不是让它们超越这些QAs的蜘蛛网:

(此列表的目的也是为了表明我知道此论坛中有多少重复的问题)

(实际上,有太多重复的问题表明现有问题的答案不完整/不清楚/不是人们正在寻找的内容)

我的问题实际上类似于这个问题:
Is String Literal Pool a collection of references to the String Object, Or a collection of Objects
这个问题的答案很棒,但没有谈论字符串池(!)。

我感到困惑,因为这些似乎提供了有关字符串池的不同解释:

  1. Thisthis回答似乎指向字符串池 除了专门为Strings
  2. 在堆内存中指定的区域外,什么都没有
  3. This答案说的相同,但也谈到了一个常数表。如果这是正确的,这个常量表是什么?怎么 它实现了(一个HashTable?)它的内容是什么?它是什么 目的
  4. this问题中的OP以及this等博客似乎表明字符串池实际上是一个"常量表",是分开的,与...无关来自堆内存
  5. this之类的文章表明涉及HaspMap。所以字符串池实际上是一个HashMap(这似乎很可能)。如果是这样,Map的结构是什么,例如,键和值是什么,以及JVM如何使用它来实现字符串池?
  6. 注意:
    我不是在寻找能够告诉我String Pooling效果的答案。例如,我不是在寻找这样的解释:

    String s1 = new String("text"); //explicitly creates a new and referentially distinct instance of a String object; 
    String s2 = "text"; //may reuse an instance from the string constant pool if one is available.
    
    System.out.println(s1 == s2);      // false , not refering to same object   
    System.out.println(s1.equals(s2)); // true
    

    我试图理解JVM如何实现String Pool - 它使用什么数据结构,这些数据结构如何适应String池逻辑等。

    PS:删除了一条符合&#34的行;请原谅我,如果我是粗鲁的"从这个问题 - 坦率地说,这与我的挫折感有关,而不是与我的问题有关,而且显然是味道不好

0 个答案:

没有答案