以下代码是java equals方法的错误实现。它违反了对称规则。但我不知道它是如何违反这条规则的。请指出它在这种方法中违反对称规则的位置。
public class WrongEquals {
private final String variable;
public WrongEquals(String variable) {
this.variable = variable;
}
@override public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o instanceof String) {
return variable.equals((String) o);
}
if (o instanceof WrongEquals) {
return variable.equals(((WrongEquals) o).variable);
}
return false;
}
@override
public int hashCode() {
return (variable == null ? 0 : variable.hashCode());
}
}
答案 0 :(得分:8)
因为您的WrongEquals
个实例可能等于某个String
,但没有String
将等于WrongEquals
的任何实例
查看String
equals()
的实现(从JDK 7开始)
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
显然,此实现确保任何相等性仅存在于另一个String
实例之间。
答案 1 :(得分:4)
(这只是Kon先前回答的扩展和说明)
尝试添加此主程序:
public static void main(String[] args){
WrongEquals a = new WrongEquals("xyzzy");
String b = "xyzzy";
System.out.println(a.equals(b));
System.out.println(b.equals(a));
}
将显示:
true
false