【发布时间】:2020-12-23 08:52:16
【问题描述】:
String类中的hashCode()方法是内存地址的可读格式。
根据以下代码 == 运算符比较内存位置或哈希码。
那么 == 运算符如何返回 false 和 hashCode() 方法如何返回 true。
public class TestStringEquals {
public static void main(String[] args) {
String s1="Hello World";
System.out.println(s1.toUpperCase()==s1.toUpperCase()); //false
System.out.println(s1.toUpperCase().hashCode()==s1.toUpperCase().hashCode()); //true
}
}
【问题讨论】:
-
"== 运算符比较内存位置或哈希码" 不,哈希码与内存位置无关。
-
具有相同哈希码的两个对象不一定必须相等,更不必说它们必须是同一个实例。此外,
String覆盖hashCode以根据其内容返回一个哈希值;所以即使Object#hashCode与与String无关的内存位置有关。 -
@Slaw,感谢您的即时回复,所以 == 运算符不比较 hashCodes?
-
没有。
==检查引用是否相等(即两个对象是否相同 instance)。请注意==不会转换为equals(尽管Object#equals的默认实现 与==相同)。 -
两个不相等的对象可以有相同的哈希码。试试字符串
AA和Ab的hashcode