美文网首页
这段代码会输出什么?为什么?

这段代码会输出什么?为什么?

作者: sxqiong | 来源:发表于2018-01-09 15:37 被阅读135次
            String 字符串=new StringBuffer("好好").append("学习").toString();
            String string=new StringBuffer("ja").append("va").toString();
            System.out.println(字符串.intern()==字符串);
            System.out.println(string.intern()==string);
    

    解释

    先了解下intern:

    当str调用intern()方法后,JVM 就会在当前类的常量池中查找是否存在与str等值的String,若存在则直接返回常量池中相应Strnig的引用;若不存在,则会在常量池中创建一个等值(相同引用)的String,然后返回这个String在常量池中的引用。
    好,知道intern是干嘛的就方便我们理解上述代码段的输出。在java中有很多字符串在执行你的函数之前就已经进入到常量池,"java"字符串就是其中一员。至于它是什么时候进入到常量池的可以参考这个连接知乎:智慧锦囊

    分解
    1. String 字符串=new StringBuffer("好好").append("学习").toString();创建字符串对象赋值为好好学习
    2. String string=new StringBuffer("ja").append("va").toString();创建string对象赋值为java
    3. 字符串.intern()
    • 常量池中无"好好学习"
    • "好好学习"引用放入常量池,返回这个引用
    • 因为intern返回的引用与字符串是同一个,所以为true
    1. string.intern()
    • 常量池中有相等(equals)的字符串"java"
    • 将常量池中的"java"引用返回
    • 因为这个intern返回的是常量池中的"java"字符串的引用,与我们创建的并不是同一个,则返回false。
    同类问题
            Integer integer1=127;
            Integer integer2=127;
            System.out.println(integer1==integer2);
            Integer integer11=128;
            Integer integer22=128;
            System.out.println(integer11==integer22);
    

    2018.08.21更新

            System.out.println("好好学习");
            String 字符串=new StringBuffer("好好").append("学习").toString();
            String string=new StringBuffer("ja").append("va").toString();
            System.out.println(字符串.intern()==字符串);
            System.out.println(string.intern()==string);
    

    出于银河同学的提问,我做了这样的补充,当我们用" "双引号的方式声明定义字符串的时候,jvm会帮我们把这个字符串放到常量池中,所以这段代码System.out.println(字符串.intern()==字符串);的输出将会是false,大家也可以做很多其他的尝试哦~~
    另一篇参考:猴子007

    相关文章

      网友评论

          本文标题:这段代码会输出什么?为什么?

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