关于String的intern()方法

举例说明:

 

String str2 = new String("str")+new String("01");

str2.intern();

String str1 = "str01";

System.out.println(str2==str1);

 

在JDK 1.7下,当执行str2.intern();时,因为常量池中没有“str01”这个字符串,所以会在常量池中生成一个对堆中的“str01”的引用(注意这里是引用 ,就是这个区别于JDK 1.6的地方。在JDK1.6下是生成原字符串的拷贝),而在进行String str1 = “str01”;字面量赋值的时候,常量池中已经存在一个引用,所以直接返回了该引用,因此str1和str2都指向堆中的同一个字符串,返回true。

 

String str2 = new String("str")+new String("01");

String str1 = "str01";

str2.intern();

System.out.println(str2==str1);

 

将中间两行调换位置以后,因为在进行字面量赋值(String str1 = “str01″)的时候,常量池中不存在,所以str1指向的常量池中的位置,而str2指向的是堆中的对象,再进行intern方法时,对str1和str2已经没有影响了,所以返回false。

---------------------

 

 

 

以上是一篇帖子的陈述,我为了保证环境的一致性,分别在jdk 1.6 ,1.7, 1.8环境下做了测试,发现结果都是一致的,与上文中表述的观点有出入,即将中间两行调换位置后结果为false的结论。

 

其实我们可以看看intern()方法的源码解释:

 

 

这方法是个native方法,并不是由java来实现的,我们可以看到红色箭头所指的那段话,只要 s1.equals(s2)为true,那么s1.intern()就等于s2.intern(),而 String s="a"; s与s.intern()是恒等的,所以最后比的就是内容罢了,

并不是调换了顺序,就导致引用不一样而返回false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值