关于Java中的hashCode()和equals(Object other)

来源:互联网 发布:算法 视频 严蔚敏 编辑:程序博客网 时间:2024/05/20 05:47

最近用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 */


原创粉丝点击