最近用Java写程序,发现这两个函数掌握的不好,所以专门看书研究了好久。
“contains方法被重新定义,用来快速查看是否某个元素已经出现在集中。他只在某个桶中查找元素,而不必查看集合中的所有元素。”——《Core Java》
当比较一个集合(Set)中是否含有一个对象的时候,调用contains函数,而contains函数又会调用hashCode快速缩小判断范围,然后再调用equals判断是否含有该对象。
注意:hashCode的值仅代表该对象在散列表中桶的位置,散列表用链表数组实现,每个链表都在一个相同的桶中。所以说,如果hashCode返回值之前没有,那么该对象一定不再集合中,如果hashCode返回之前存在,那再根据equals判断。
如下程序:
import java.util.HashSet;
public class test {
public static void main(String...arg){
Node node1 = new Node(12);
Node node2 = new Node(12);
open.add(node1);//调用hashCode,发现之前没有,新对象
open.add(node2);//调用hashCode,发现之前有,再调用equals,发现返回值一样,故判断该对像之前存在,拒绝加入
Node node3 = new Node(12);
System.out.println(open.contains(node3));//调用hashCode,发现之前有,再调用equals,发现返回值一样,故返回true表示存在
System.out.println(node1.equals(node3));//仅仅调用equals方法
}
static HashSet<Node> open = new HashSet<Node>();
}
class Node{
public Node(int a){
this.a = a;
}
public boolean equals(Object other){
System.out.println("equals");
Node otherNode = (Node) other;
if(this.a == otherNode.a) return true;
else return false;
}
public int hashCode(){
System.out.println("hashCode");
return a;
}
int a = 0;
}
/*输出:
* hashCode
* hashCode
* equals
* hashCode
* equals
* true
* equals
* true
*/