【发布时间】:2014-01-16 06:45:21
【问题描述】:
这是我在 SCJP 书中使用的一段代码。 我知道 == 比较对象的内存位置以找到相等性,而 .equals 比较哈希码以确定相等性。
我的问题在下面的 sn-p 中,在我们比较的覆盖的 equals 方法中:
(((Moof)o).getMoofValue()) == this.getMoofValue()
在上面的代码中,== 是否比较了字符串值的内存位置?如果是这样,那么它应该是错误的。但它返回真。 == 在这里是如何工作的?
public class EqualsTest {
public static void main(String args[]){
Moof one = new Moof("a");
Moof two = new Moof("a");
if(one.equals(two)){
System.out.println("Equal");
}
else{
System.out.println("Not Equal");
}
}
}
public class Moof {
private String moofValue;
public Moof(String i){
this.moofValue = i;
}
public String getMoofValue(){
return this.moofValue;
}
public boolean equals(Object o){
if((o instanceof Moof) && (((Moof)o).getMoofValue()) == this.getMoofValue()){
return true;
}
return false;
}
}
【问题讨论】:
-
对于基元“==”比较“他们的价值”对于非基元“==”比较引用...在这里,您将 2 个字符串与“==”进行比较,所以基本上你是比较引用.. BTW equals() 默认比较引用...它不比较 hashCode。
-
equals()不会“比较哈希码”......它会比较任何方法编写的比较。 -
".equals 比较哈希码以确定相等性" - 看到一个这样做的类我会感到非常惊讶。即使在极少数情况下它确实有效,它也不会有效。
-
除此之外,您发布的代码损坏,因为它没有正确比较
Strings。它使用==比较参考值 -
感谢您的快速回复。但是 String 不是原始的。这就是我在上面的代码中比较的。