java intern 与本身_intern()在Java 6和Java 7中的行为有所不同

小编典典

似乎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中,不再将永久字符串分配给Java堆的永久代,而是分配给Java堆的主要部分(称为年轻代和旧代),以及由应用程序创建的其他对象。

。此更改将导致更多数据驻留在主Java堆中,而永久生成中的数据更少,因此可能需要调整堆大小。由于此更改,大多数应用程序只会看到相对较小的堆使用差异,但是加载许多类或大量使用String.intern()方法的大型应用程序将看到更大的差异。

不知道这是一个错误,以及从哪个版本开始……JLS 3.10.5声明

显式内联计算所得字符串的结果是与任何具有相同内容的现有文字字符串相同的字符串。

因此,问题是如何在编译时或执行时解释预先存在的内容:“ Goodmorning”是否预先存在?

我更喜欢7之前实现的方式…

2020-09-15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值