String类的intern 方法的例题详解

2 篇文章 0 订阅

ps:1.8和1.6版本的intern方法的做法会有所不同

jdk 1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串 池中的对象返回
jdk1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份, 放入串池, 会把串池中的对象返回

(基于1.8来实现)
例题一:

public class Demo1_23 {
    //  ["ab", "a", "b"]
    public static void main(String[] args) {
        String s = new String("a") + new String("b");
        // 堆  new String("a")   new String("b") new String("ab")
        String s2 = s.intern(); // 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串池中的对象返回
        System.out.println( s2 == "ab");  //true
        System.out.println( s == "ab");  //true
    }
}

例题二:

public class Demo1_23 {
    //  ["ab", "a", "b"]
    public static void main(String[] args) {
        String x = "ab";
        String s = new String("a") + new String("b");
        // 堆  new String("a")   new String("b") new String("ab")
        String s2 = s.intern(); // 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串池中的对象返回
        System.out.println( s2 == x);  //true
        System.out.println( s == x );  //false
    }
}

ps:通过上面的两个例子可以更好的理解intern,第一个例子中常量池没有常量,所以使用s.intern()时,是将堆中引用的对象放入常量池,并返回s2,所以下面两个式子都为true;第二个例子中常量池原本有“ab”常量,所以返回的s2是常量池中的对象,所以第一个式子相同,第二个不相同。

jdk1.6和1.8主要的区别在于串池中原本没有“ab”的情况
(基于1.6)

public class Demo1_23 {
    //  ["ab", "a", "b"]
    public static void main(String[] args) {
        String s = new String("a") + new String("b");
        // 堆  new String("a")   new String("b") new String("ab")
        String s2 = s.intern(); // 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串池中的对象返回(因为是1.6所以先拷贝一份在放入串池,然后返回,所以串池中的对象和s中的是两个不同的对象)
        String x="ab";      
        System.out.println( s2 == x);   //true
        System.out.println( s == x );   //false
    }
}

ps:s2和x都是串池中的对象,s是堆中的对象,所以是false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值