intern() 方法

intern() 方法返回字符串对象的规范化表示形式。

它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

具体不做介绍,请看引用:http://www.runoob.com/java/java-string-intern.html

来一段有意思东西:

//1:
        String s1 = new StringBuilder("go").append("od").toString(); 
        System.out.println(s1.intern() == s1); 
//2:
        String s0 = "good";
        String s2 = new StringBuilder("go").append("od").toString(); 
        System.out.println(s2.intern() == s2); 
//3:
        String s3 = new StringBuilder("ja").append("va").toString(); 
        System.out.println(s3.intern() == s3);

 

结果1:true;  结果2:false;  结果3:false;

 

第一次看见这个的小伙伴是不是,瞬间看到了三个字母'WTF',代码一样的,只是值不一样吧。

结果1:s1.intern()发现"good"在常量池中不存在,则指向了s1;此时结尾声明一个"good" 在常量池中创建,则会直接指向s1;

结果2:s0已经在常量池创建了"good",所以s2.intern()直接指向了s0,堆中的s2与s0对比自然false;

结果3:看上去是结果1,但实际上这就是结果2,因为有些关键词在JDK中就已经在常量池中创建了。

 

注:在你的程序启动时,就已经装载来很多class,这里面也有字符常量的创建,只是不是你自己创建的,你只是不知道而已。

 

     在一个已实例化的String对象上调用intern()方法后,虚拟机会在String缓冲池内寻找与此Stirng对象所封装的字符串内容相同值的String对象,然后把引用赋值给引用原来的那个String对象的String类型变量。如果String缓冲池内没有与此String对象所封装的字符串内容相同值的String对象存在,那么虚拟机会为此创建一个新的String对象,并把其引用赋值给引用原来的那个String对象的String类型变量

 

采用new 创建的字符串对象不进入字符串池

字符串相加的时候,都是静态字符串的结果会添加到字符串池,如果其中含有变量则不会进入字符串池中

intern()有两个作用,第一个是将字符串字面量放入常量池(如果池没有的话),第二个是返回这个常量的引用

 

如果不能理解,推荐一个博文:https://blog.csdn.net/SEU_Calvin/article/details/52291082  让你豁然开朗

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值