equals()和hashCode()

来源:互联网 发布:淘宝买家信用等级是- 编辑:程序博客网 时间:2024/06/13 06:36

equals()和hashCode() 总结

一、“==”关系

1.对于引用型变量(如String,Object),就是比较两个对象是不是同一个对象,即是否指向了同一个对象;

2.对于值类型变量(如int,double),比较的就是两个数据是不是相等。

 

二、“equals”关系

之所以出现equals()方法,是因为很多时候“==”不能反应“相等”。如,对于String对象,当两个对象的字符串序列是一直的,我们就认为他们是“相等”的。

注: Object中equals()的默认实现是比较两个对象是不是“==”

 

三、“hashCode”关系

1. hashCode返回的是哈希码,是在内存地址上经过特定算法得到的。

2. HashCode 其只是在需要用到哈希算法的数据结构中才有用,比如在 HashSet、HashMap 和Hashtable中,其用途是为了方便快速地查找对象。

注:哈希码不是内存地址;

 

四、“equals”与“hashCode”的关系

1.覆写equals后,尽量同时也覆写hashCode,覆写规则见附-1;

2. 对于equals()相等的两个对象,其hashCode()返回的值一定相等;

3. 如果两个对象hashcode不相等,他们一定不equals

4. 两个对象的hashCode相同,并不一定表示两个对象就相同。可以理解为“存放在同一个篮子里”,内存相当于由许多篮子组成,每个篮子对应一个hash值,同时,每个篮子中可以有多个对象,存放在相同篮子内的对象有相同的hash值

5.向不允许重复元素的集合中添加元素,按照如下规则判断:

       1)比较hash值,集合中不存在相同的hash值,则添加对象;

       2)当存在相同hash值,继续判断qeuals,均不equals,则添加对象;

       3)否则对象已存在,添加失败。

 

 

附-1:覆写规则

1.如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。

2.如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。

3.另外,对于equals()不同的对象要尽量做到hash码不同

1 0