举个例子,比如说我们自定义了一个Node类如下:
class Node{
int x;
int y;
public Node(int x,int y){
this.x=x;
this.y=y;
}
}
然后,创建一个Node的Set集合,并add一个Node对象nd1,同时new一个xy值与nd1相同的nd2:
Node nd1 = new Node(1,2);
Node nd2 = new Node(1,2);
Set<Node> st=new HashSet<>();
st.add(nd1);
此时,如果调用Set的contains()方法如下:
System.out.println(st.contains(nd2));
系统将会输出false。因为nd1与nd2虽然值相等,但并不是同一个对象。如果我们希望contains方法能够对值相等的Node对象返回true,应该怎样改写?
答案是,重写Node类的public boolean equals()、public int hashCode()方法如下:
@Override
public boolean equals(Object obj){
Node node = (Node)obj;
return node.x==x&&node.y==y;
}
@Override
public int hashCode() {
return x * x + y * y * y;
}
这样无论是HashSet的contains()还是HashMap的containsKey()方法,都会被改写为依据Node对象的值是否相等来判定元素是否存在。