天天看点

哈工大软件构造-equals()和hashcode()

文章目录

    • equals()
    • hashcode()
    • equals()和hashcode()
    • 怎样重写equals()

equals()

在java中,等价可以分为两大类:

  1. 引用等价性(==)

    也就是简单粗暴的判断引用的地址是否相同

  2. 对象等价性

    也就是判断两个对象逻辑上是否等价,也分为两种方法:行为等价性及观察等价性。而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()和hashcode()

怎样重写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;
	}