java字符串方法intern记录

public static void main(String[] args) {
        String s1 = new String("hello");
        String intern1 = s1.intern();
        String s2 = "hello";
        System.out.println(s1 == s2);
        String s3 = new String("hello") + new String("hello");
        String intern3 = s3.intern();
        String s4 = "hellohello";
        System.out.println(s3 == s4);
    }

返回结果:

在jdk1.6下运行的结果为:

  false,false

在jdk1.7,1.8下运行的结果为:

  false,true

对调 String intern3 = s3.intern();
        String s4 = "hellohello";之后

在jdk1.8下  false  false

 

 原因

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

    它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
    我猜测,如果调用intern方法的时候常量池里没有这个字符串,会在常量池新建这个字符串,然后将String的指向指到常量池,这个时候在写String s4 = "hellohello"; s4也会指向常量池,如果调用intern方法的时候常量池里有这个字符串,应该是会更新对象的指向到这个常量池,但是不更新对象的地址。

  s1!=s2 是因为声明s1的时候常量池中初始化了这个字符串,在调用方法的时候,方法没有对s1的对象做任何操作,只是返回了这个字符串.

  s3==s4是因为 s3声明的时候+操作会new一个Stringbuffer,然后app,Stringbuffer不会在常量池中初始化"hellohello"字符串,在调用方法的时候,会去常量池初始化这个字符串,并跟新s4的指针。

intern详解见转载http://www.jianshu.com/users/90ab66c248e6/latest_articles

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值