1 、String a = "123";
String b = "123";
a == b; //true
a.equals(b); //true
2、String a = new String("123");
String b = new String("123");
a == b; //false
a.equals(b); //true
3、String a = new String("123").intern();
String b = new String("123").intern();
a == b; //true
a.equals(b); //true
String b = "123";
a == b; //true
a.equals(b); //true
2、String a = new String("123");
String b = new String("123");
a == b; //false
a.equals(b); //true
3、String a = new String("123").intern();
String b = new String("123").intern();
a == b; //true
a.equals(b); //true
造成上面三种不同结果的分析:
例1:a创建的字符串常量放在了方法区的常量池中,在定义b的时候会先到常量池中查找是否存在该字符串常量。因为存在,所以b直接使用该字符串常量,因此a和b的内容相同,引用也相同。
例2:通过String构造方法创建的字符串会直接在堆中产生对应的String类型对象,然后a直接引用该对象。当定义b的时候又会在堆中创建新的对象。因此,尽管a和b的内容相同,但是引用了不同的对象,使得a != b。
例3:在调用String的intern方法的时候,会去常量池中看是否有与该对象内容相同的字符串(即equals为true)。若没有,则将该字符串放到常量池并返回常量池的字符串;若有,则直接返回常量池的字符串。(注意:JDK1.7之前结果不同)
因此下面判断结果:
"123" == new String("123").intern(); //true
"123" == "123".intern(); //true
String a = new String("123");
a == a.intern(); //false