前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java String的intern方法 在JDK6和JDK7的不同行为

Java String的intern方法 在JDK6和JDK7的不同行为

作者头像
用户1212940
发布2022-04-13 15:21:40
4740
发布2022-04-13 15:21:40
举报
文章被收录于专栏:Lambda
代码语言:javascript
复制
String str1 = new StringBuilder("a").append("b").toString();  //1
System.out.println(str1.intern() == str1);                    //2
String str2 = new StringBuilder("c").toString();              //3
System.out.println(str2.intern() == str2);                    //4

java 内存模型中存在一个叫做 String常量池的区域,其中存放着字符串常量。

首先说明一下,在jdk版本小于等于1.6的时候,执行上述代码的结果会是

代码语言:javascript
复制
false
false

jdk 版本大于1.6 时,上述代码的执行结果为

代码语言:javascript
复制
true
false

造成以上两种不同结果的原因是,jvm对 intern()方法的实现不同。

在jdk1.6及以前,调用intern()

如果常量池中不存在值相等的字符串时,jvm会复制一个字符串到创量池中,并返回常量池中的字符串。

而在jdk1.7及以后,调用intern()

如果常量池中不存在值相等的字符串时,jvm只是在常量池记录当前字符串的引用,并返回当前字符串的引用。

接下来,我们再解释上述代码在jdk1.7及以上jdk中为什么会得到一个true一个false。

当存在上述代码的类被JVM加载时,字面值常量 a, b, c 就会被加载到 String 常量池中(注意,这是在编译阶段就确定了的常量字符串)。

当执行str1.intern()时,由于常量池中并不存在字符串ab,jvm 会在常量池中记录str1的引用,并返回str1的引用,因此,第2行代码的输出为true。

str2使用字面值常量 c构造了一个新的字符串(正如上面说的一样,'c'已经在编译阶段就确定下来了,在类加载时候就加载到String 常量池中了),该字符串的引用和常量池中字面值c字符串的引用不相同,当调用str2.intern()时, 常量池中已经存在了c,jvm直接返回常量池中的引用,该引用不同于重新构造的str2,因此第4行代码的输出为false。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/09/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档