String a = "ab";
String c = "a";
String d = "b";
System.out.println(a==(c+d));
System.out.println(a==("a"+"b"));结果是 false true为什么?
String c = "a";
String d = "b";
System.out.println(a==(c+d));
System.out.println(a==("a"+"b"));结果是 false true为什么?
对于对象类型,==比较的是内存地址
String a = "ab";
String c = "a";
String d = "b";分别在内存中创建了三个对象,占用了不同的地址,比较址可以用c.equals(c+d);
若要判断内容相同用a.equals(b)
String a = "ab";
String c = "a";
String d = "b";
String e = "a"+"b";
System.out.println((c+d).hashCode());
System.out.println(("a"+"b").hashCode());
System.out.println("ab".hashCode());
System.out.println(a.hashCode());
hashCode是这个对象的唯一标示,==的判断是根据引用的地址,可否简单的理解成hashCode的值?
-------------------------
我是问为什么会处先这种情况,不是说不知道用a.equals()这个比较。这里跟equals()没有关系
----------------------------------------
这个我明白。
为什么"ab" 和 "a" + "b" 的地址相同
而和 c + d 的地址不同呢?
"a"+"b" 被编译时处理为"ab"
但是c+d是运行时处理的(因为是变量)
“a”+“b”相当与“ab”,虚拟机会在常量池中查找“ab”,如果匹配则临时分配一变量指向该入口,那么地址就和a一样了
不知道这样理解对不对
所以结论是,JVM会内在地为字符串字面量维护一些唯一的String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过new关键字创建的String对象而困扰,不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。下一小节会向大家展示更多的信息