关于java String的intern()方法的理解

1.首先先来看这样一个问题:
String s1 = new String (“test”);
String s2 = new String(“test”);
在这个过程中,创建了几个String对象?
答案是3个:一个test常量在常量池中,两个在堆中,对应的引用分别为s1和s2.
参考:http://blog.csdn.net/xsf50717/article/details/47339415

2.现在来理解JDK1.7中的intern()方法的工作过程:
String str1 = new StringBuilder(“ja”).append(“av”).toString();
System.out.println(str1 == str1.intern());
String str2 = new StringBuilder(“计算机”).append(“技术”).toString();
System.out.println(str2 == str2.intern());
对于上面的代码,在这里我们使用的是StringBuilder来创建字符串,所以并不会在常量池中创建“java”这个字符串对象和“计算机技术”对象(“java”这个字符串对象本来是存在在常量池的)。所以现在在常量池里面有一个“java”字符串对象,但是没有“计算机技术”这个字符串对象。
在执行str1.intern()这行代码的时候,因为常量池中已经有“java”字符串了,所以直接返回常量池中“java”字符串的引用,而str1返回的是堆中的“java”字符串的引用,所以二者不相等输出false.
在执行str2.intern()这行代码的时候,因为常量池中没有”计算机技术”这个字符串对象,所以会在常量池中记录一个指向堆中”计算机技术”这个字符串的引用,并返回给str2.intern(),也就是说堆中现在保存的是字符串引用了,而不是像JDK1.6中那样,保存的是字符串。所以输入false.
注意:String s1 = new String(“test);
String s2 = new StringBuilder(“test”).toString();
都会在常量池创建“test”常量,而
String s3 = new StringBuilder(“te”).append(“st”).toString();
则不会在常量池创建”test”常量,而会创建”te”和”st”两个常量。
参考:
http://blog.csdn.net/baidu_31657889/article/details/52315902
http://www.cnblogs.com/wxgblogs/p/5635099.html
《深入理解java虚拟机》周志明 著

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值