public boolean equals(Object anObject) { if (this == anObject) { return true; } else { if (anObject instanceof String) { String aString = (String)anObject; if (this.coder() == aString.coder()) { return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value); } } return false; } }
public class Test { public static void main(String args[]) { String a="a"; String b="b"; String c=a+b; String d=new String("ab"); System.out.println(a.equals(b)); System.out.println(a + b == c); System.out.println(c == d); System.out.println(c.equals(d)); } }
字符串拼接: String a = "a"; String b = "b"; //常量池中的对象(不会创建 StringBuilder 对象) String str1 = "a" + "b"; //在堆上创建的新的对象 String str2 = a + b; //常量池中的对象(不会创建 StringBuilder 对象) String str3 = "ab"; System.out.println(str1 == str2);//false System.out.println(str1 == str3);//true System.out.println(str2 == str3);//false
public boolean equals(Object anObject) { if (this == anObject) { return true; } else { if (anObject instanceof String) { String aString = (String)anObject; if (this.coder() == aString.coder()) { return this.isLatin1() ? StringLatin1.equals(this.value, aString.value) : StringUTF16.equals(this.value, aString.value); } } return false; } }
intern
时,都看做变量,使用new创建对象,返回堆区地址; intern
,则会返回常量池中的地址; String s1 = "JavaEE"; String s2 = "Hadoop"; // 字面量定义,保存在常量池 String s3 = "JavaEEHadoop"; // 常量与常量的拼接 String s4 = "JavaEE" + "Hadoop"; // 对象参与拼接 String s5 = s1 + "Hadoop"; String s6 = "JavaEE" + s2; // 拼接结果调用intern方法 String s7 = (s1 + s2).intern(); // true System.out.println(s3 == s4); // false System.out.println(s3 == s5); // false System.out.println(s3 == s6); // false System.out.println(s5 == s6); // true System.out.println(s7 == s3); // final修饰,变成常量 final String s8 = "JavaEE"; String s9 = s8 + "Hadoop"; // true System.out.println(s9 == s3);