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"字符串就是其中一员。至于它是什么时候进入到常量池的可以参考这个连接知乎:智慧锦囊
分解
-
String 字符串=new StringBuffer("好好").append("学习").toString();
创建字符串
对象赋值为好好学习
-
String string=new StringBuffer("ja").append("va").toString();
创建string
对象赋值为java
字符串.intern()
- 常量池中无
"好好学习"
- 将
"好好学习"
引用放入常量池,返回这个引用 - 因为intern返回的引用与
字符串
是同一个,所以为true
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