String.intern()方法

2018-01-22  本文已影响0人  wtmxx
public class TestIntern {
    public static void main(String[] args) {
        //这个String初始化语句,在堆区生成了String对象,并且在运行时常量池生成了"12"
        String s = new String("12");  
        //jdk1.6和jdk1.7中的intern有着差别,jdk1.7中常量池位置由方法区变成了堆区
        //jdk1.6中,执行此处的intern()会检查常量池是否有"12",如果有会返回常量池该处的引用;如果没有,
        //则在常量池中新建一个"12"
        //jdk1.7中,执行此处的intern()也会检查常量池,如果有会返回常量池该处引用;如果没有,如果堆区已经有
        //了一个值相同的字符串对象,那么会在常量池保存该对象的引用而不是新建一个字符串。
        s.intern();  
        //s2是指向常量区字符串的引用
        String s2 = "12";  
        //jdk1.6中打印false,因为s指向堆中的String对象,s2指向常量池字符串
        //jdk1.7中打印false,因为s.intern()时常量池已经存在"12",故s和s2指向对象不同
        System.out.println(s == s2);  
        
        //这里在堆区新建了对象"11", 常量区新建了对象"1"
        String s3 = new String("1") + new String("1");
        //jdk1.6中执行intern()后, 在常量池新建了字符串"11"
        //jdk1.7中执行intern()后,因为堆中已经存在"12"字符串,所以常量池保存的是s3的引用
        s3.intern(); 
        //s4指向常量池的"11"在jdk1.6中他指向的是常量池的11,在jdk1.7中他指向的是常量池中记录的s3的引用
        String s4 = "11";  
        //jdk1.6中返回false
        //jdk1.7中返回true
        System.out.println(s3 == s4);  
    }
}
上一篇下一篇

猜你喜欢

热点阅读