文章目录
-
- equals()
- hashcode()
- equals()和hashcode()
- 怎样重写equals()
equals()
在java中,等价可以分为两大类:
-
引用等价性(==)
也就是简单粗暴的判断引用的地址是否相同
-
对象等价性
也就是判断两个对象逻辑上是否等价,也分为两种方法:行为等价性及观察等价性。而equals()就是判断对象等价性。
hashcode()
java中对hashcode()的作用:
hashCode()的作用是为了提高在散列结构存储中查找的效率,在线性表中没有作用;只有每个对象的 hash 码尽可能不同才能保证散列的存取性能,事实上 Object 类提供的默认实现确实保证每个对象的 hash 码不同(在对象的内存地址基础上经过特定算法返回一个 hash 码)。
java中对hashcode()的规约:
- 程序执行期间只要对象 equals 方法比较操作所用到的信息没有被修改,则对这同一个对象无论调用多次 hashCode 方法都必须返回同一个整数。
- 如果两个对象根据 equals 方法比较是相等的则调用这两个对象中任意一个对象的 hashCode 方法都必须产生同样的整数结果。
- 如果两个对象根据 equals 方法比较是不相等的,则调用这两个对象中任意一个对象的 hashCode 方法不一定要产生相同的整数结果
hashcode()与==的关系
若 == 返回true,则两边的对象的hashCode()返回值必须相等,若 == 返回false,则两边对象的hashCode()返回值可能相等,也可能不等,因为Java中对象默认的equals()方法就是用==实现的。
equals()和hashcode()
hashcode()说白了就是类的哈希值,那为什么重写equals时要重写hashcode()。
因为在某些元素不可重复的集合类中(如HashMap,HashSet)为了避免每次添加元素时都要进行复杂的equals()比较,所以会先比较hashcode(),当有已存在元素hashcode()相等时才会进行equals()比较,这样就大大提升了效率。
但这也使得当我们重写equals()时,如果不重写hashcode()会导致利用hashcode()的集合类无法正常使用。
注: 下面附一张关于HashMap,HashSet的比较流程
怎样重写equals()
public boolean equals(Object obj) {
if(obj==this)
return true;
if(obj==null)
return false;
//假设我要比较的类为try1
if(! (obj instanceof try1))
return false;
try1 other=(try1)obj;
//这里填写对于内部rep的比较
...
return false;
}