String类的intern方法

  首先源码中对其的解释是:Returns a canonical representation for the string object.返回字符串对象的规范表示形式。Returns: a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.返回与此字符串有相同内容,但保证来自唯一字符串池的字符串

  首先介绍一下字符串常量池。字符串池最初为空,由String类单独维护。如果是直接赋值的方式,如String str = "abc",则会在常量池中创建一个string对象,并且其value指向byte/char数组。也即字符串常量池(StringTable)存的是对象的引用,并非真正的对象。后续如果再采取这种字面量赋值的形式时,会复用常量池的这个对象。  注意!如果是new的方式,一定会在堆中再创建一个新的对象

  掌握了这些知识,就很容易理解intern方法了。当调用intern方法时,如果池中已经包含了一个与此string对象相等的字符串(通过equals方法进行比较),就返回池中的对象【看是否接收,如果不接受相当于什么也没发生,接收就改变了变量的指向】

【不接收的情况】池中已经有abc了,调用intern方法返回池中的对象,不改变str的指向

String s = "abc";
String str = new String("abc");
str.intern();
System.out.println(s == str);//false

【接收的情况】池中已经有abc了,调用intern方法返回池中的对象,此时用str接收会改变str指向

String s = "abc";
String str = new String("abc");
str = str.intern();
System.out.println(s == str);//true

如果池中并没有,那么就将此string对象的引用放入池中(1.8),池中引用的地址和堆中string对象的地址相同【1.6的做法是拷贝一份到池中,池中的地址和堆中string对象的地址不相同】

【 例一(1.8环境)】

String s = "ab";
String str = new String("a") + new String("b");
str.intern();
System.out.println(s == str);//false

这个很好理解。等到调用str.intern时想把str的引用放进去,但是由于执行完第一行常量池就有"ab"了,因此返回"ab"的引用,也即相当于啥事都没发生

【例二(1.8环境)】

String str = new String("a") + new String("b");
str.intern();
String s = "ab";
System.out.println(s == str);//true

首先new String("a")会在堆中创建一个对象,常量池也创建一个对象。但由于是两个new String相加,底层是stringbuilder的append,只会在堆中创建一个对象new String("ab")并赋给str。常量池中还并没有ab。此时str.intern会将str也即new String("ab")的引用放入常量池中。等到第3行执行String s = "ab"时,发现常量池中已经有ab(的引用)了。也即s指向的就是new String("ab")的地址,和str进行==地址比较自然是true

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值