栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

intern()在Java 6和Java 7中的行为有所不同

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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中解决的重要RFE

在JDK 7中,不再将永久字符串分配给Java堆的永久代,而是分配给Java堆的主要部分(称为年轻代和旧代),以及由应用程序创建的其他对象。
。此更改将导致更多数据驻留在主Java堆中,而永久生成中的数据更少,因此可能需要调整堆大小。由于此更改,大多数应用程序只会看到相对较小的堆使用差异,但是加载许多类或大量使用String.intern()方法的大型应用程序将看到更大的差异。

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

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

因此,问题是如何在编译时或执行时解释预先存在的内容:“ Goodmorning”是否预先存在?
我更喜欢7之前实现的方式…



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569224.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号