JVM如何重用interned String子串?

Jor*_*lla 19 java string specifications effective-java

我知道你是否做到了

for (condition) {
    String s = "hi there";
}
Run Code Online (Sandbox Code Playgroud)

只是一个String实例在所有的迭代创建的,不像String s = new String("hi there");是会在每次迭代中创建一个新的实例.

但是,阅读约书亚布洛赫的有效Java:第2章第5章(第20页),它指出:

此外,保证对象将被在同一虚拟机中运行的任何其他代码重用,这些代码恰好包含相同的字符串文字[JLS,3.10.5].

不说的AFAIK 恰好相同的字符串文字,它说包含.

阅读[JLS,3.10.5]无法找到任何确切的参考,我有一个疑问.

给这个片段:

String s1 = "hi ";
String s2 = "there";
String s3 = "hi there";
Run Code Online (Sandbox Code Playgroud)

创建了多少个实例?

  • 3个实例(因此,短语并不是非常精确).
  • 2个实例,s1然后s2(然后s3创建重用s1s2引用)

Joa*_*uer 16

JLS不保证任何子字符串的重用.这里的"包含"只是意味着该类在某处提到完全相同的字符串文字.它用于"子串"意义上.

  • @JordiCastilla:我不认为任何当前的VM重用子串,但它是可能的(例如,当两个字符串是彼此的子串时,OpenJDK的先前迭代有时会共享底层char []).请注意,您仍然*观察单独的`String`实例,并且没有公共API来检测是否正在发生这种情况(即,如果没有一些反射技巧,您将无法判断). (3认同)
  • 具体_"任何其他代码[..]碰巧包含**相同的字符串文字**"_(强调我的) (2认同)