美文网首页
String.intern()方法

String.intern()方法

作者: wtmxx | 来源:发表于2018-01-22 23:23 被阅读0次
    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);  
        }
    }
    

    相关文章

      网友评论

          本文标题:String.intern()方法

          本文链接:https://www.haomeiwen.com/subject/ysnlaxtx.html