String.intern()函数

        环境:JDK1.8

        测试代码

public static void main(String[] args) {
        String s1 = new StringBuilder("go").append("od").toString();
        System.out.println(s1.intern() == s1);
        String s2 = new StringBuilder("ja").append("va").toString();
        System.out.println(s2.intern() == s2);
    }

        结果:true  false

        分析:s1和s2开始通过new StringBuilder创建的时候肯定在堆里,s1.intern()字符串常量池取当前字符,肯定没有,但是Java8做了优化,直接在常量池保存当前对象的指针,所以相等,然而s2.intern()去字符串常量池取的"java"字符,这是本来就内置在常量池里面的字符串,所以不相等。上面代码在不同JDK版本中的结果可能不太一样。

 

      下面我把上面的代码稍微改动:看看结果有什么不一样

    public static void main(String[] args) {
        String s1 = "go" + "od";
        System.out.println(s1.intern() == s1);
        String s2 = "ja" + "va";
        System.out.println(s2.intern() == s2);
    }

 

       结果:true  true

       分析:上面代码String s1 = "go" + "od"其实经过编译器优化后等同于String s1 = "good",s2道理一样,通过下图字节码证实我的话,都是在字符串常量池取的字符串,所以为true。

      

          Java字节码指令含义:http://www.blogjava.net/DLevin/archive/2011/09/13/358497.html

         

 

      

 

posted @ 2019-08-08 15:23  Don'tYouSee  阅读(699)  评论(0)    收藏  举报