一,equals方法
根据 Object 中的equals()
源码,有如下约定:
- 自反性:对于非 null 的对象 x,必须有 x.equals(x)=true;
- 对称性:如果 x.equals(y)=true,那么 y.equals(x) 必须也为true;
- 传递性:如果 x.equals(y)=true 而且 y.equals(z)=true,那么x.equals(z) 必须为true;
- 对于非 null 的对象 x,一定有x.equals(null)=false
- 当equals(Object obj)方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
二,hashcode方法
根据 Object 中的hashCode()
源码,有如下约定:
- hashCode的存在主要用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的。
- 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同。
- 如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点。
- 两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。
程序员必须搞清的概念equals和=和hashcode的区别
JAVA基础-自问自答学hashCode和equals
Java 的 equals 与 hashcode 对比分析