public class Test {
private final static String MESSAGE = "taobao";
public static void main(String arg[]){
String a = "tao" + "bao";
String b = "tao";
String c = "bao";
System.out.println(MESSAGE.hashCode());
System.out.println(a.hashCode());
System.out.println((b+c).hashCode());
System.out.println(b+c);
System.out.println(a==MESSAGE);
System.out.println((b+c)==MESSAGE);
System.out.println((b+c)==(b+c));
}
}结果:-881000146
-881000146
-881000146
taobao
true
false
falseJavaString
System.out.println((b+c)==MESSAGE);
System.out.println((b+c)==(b+c));
此时 发现有相同的值 所以a也指向Message的值 a和Message都指向taobao 所以为true
System.out.println((b+c)==MESSAGE);//b+c 是2个字符串变量相加,会创建一个新的值
这个新值和老值虽然内容相同,但是它们的地址不一样。所以为false
System.out.println((b+c)==(b+c));
System.out.println(a==MESSAGE);//true 说明两个字符串常量相加不会生成新的String对象,当然,前提是常量池中包含相加后的字符串。
System.out.println((b+c)==(b+c));//false 说明两个String变量b,c相加b+c会生成一个新的String对象
而
String a1 = new String("taobao"); 会生成一个新的对象
String a = "tao"+"bao"; 会在字符串池中查找"taobao"字符串并指向它,所以a 和 MESSAGE指向同一地址
b+c 是指向两个地址的字符串重组成一个串,会重新生成一个字符串对象,所以与MESSAGE比较结果不一样
(b+c) == (b+c) 结果是false 是因为没执行一次b+c都会重新生成一个对象,地址自然不同
String 中equals()重写了Object的equals方法 比的是值,有兴趣的话可以试试结果会全部是true