似乎JDK7处理实习生的方式与以前不同。
我用版本1.7.0-b147进行了测试,结果“都是相等的”,但是用1,6.0_24执行它(相同的字节码)时,我没有得到消息。
它还取决于该
String b2 =...行在源代码中的位置。以下代码也不会输出该消息:
class Test { public static void main(String... args) { String s1 = "Good"; s1 = s1 + "morning"; String s2 = "Goodmorning"; System.out.println(s1.intern()); //just changed here s1.intern() and the if condition runs true if(s1 == s2) { System.out.println("both are equal"); } //now it works. }}
似乎
intern在其字符串池中找不到String之后,将实际实例s1插入池中。创建s2时,JVM正在使用该池,因此它获得与s1相同的引用。另一方面,如果首先创建s2,则该引用将存储到池中。
这可能是由于将永久字符串从Java堆的永久生成中移出的结果。
在这里找到:JDK
7中解决的重要RFE
在JDK 7中,不再将永久字符串分配给Java堆的永久代,而是分配给Java堆的主要部分(称为年轻代和旧代),以及由应用程序创建的其他对象。
。此更改将导致更多数据驻留在主Java堆中,而永久生成中的数据更少,因此可能需要调整堆大小。由于此更改,大多数应用程序只会看到相对较小的堆使用差异,但是加载许多类或大量使用String.intern()方法的大型应用程序将看到更大的差异。
不知道这是一个错误,以及从哪个版本开始……JLS 3.10.5声明
显式内联计算所得字符串的结果是与任何具有相同内容的现有文字字符串相同的字符串。
因此,问题是如何在编译时或执行时解释预先存在的内容:“ Goodmorning”是否预先存在?
我更喜欢7之前实现的方式…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)