什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
请考虑以下代码段:
import java.util.*;
public class EqualsOverload {
public static void main(String[] args) {
class Thing {
final int x;
Thing(int x) { this.x = x; }
public int hashCode() { return x; }
public boolean equals(Thing other) { return this.x == other.x; }
}
List<Thing> myThings = Arrays.asList(new Thing(42));
System.out.println(myThings.contains(new Thing(42))); // prints "false"
}
}
Run Code Online (Sandbox Code Playgroud)
注意contains返回false!!! 我们似乎失去了我们的东西!
这个bug,当然是事实,我们不小心过载,而不是,重写,Object.equals(Object).如果我们class Thing改为编写如下,contains则按true预期返回.
class Thing {
final …Run Code Online (Sandbox Code Playgroud)