欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java重写equals和hashcode方法分析

程序员文章站 2024-01-13 20:35:22
...

通常业务中我们定义两个对象,如果他们属性相同的话,就认为他们是相等的。

但是对象自带的等于方法,是用==比较的,比较的对象引用,但是不一定是一个对象地址,也有相同属性内容,业务需要让他俩等于相同,所以就需要重写equals了(如果不懂看这篇文章

这是对象自带的等于方法,内部是==比较的对象引用。

public boolean equals(Object obj) {
        return (this == obj);
    }

下面重写equals方法演示

Animals

package MaEquals.RewriteEquals;

import java.util.Objects;

public class Animals {
	private String name;
	private String skill;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSkill() {
		return skill;
	}

	public void setSkill(String skill) {
		this.skill = skill;
	}

	/**
	 * 重写对象的equals方法,判等
	 * 
	 * @param objk
	 * @return
	 */
	@Override
	public boolean equals(Object objk) {
		// 判断引用地址是否相等
		if (this == objk) {
			return true;
		}
		// 判断类型是否相同
		if (objk.getClass() != Animals.class) {
			return false;
		}
		// 判断引用不同的情况,属性是否相同
		if (objk != null) {
			// 类型相同看属性是否相同
			Animals animal = (Animals) objk;
			if (Objects.equals(animal.getName(), this.name) && Objects.equals(animal.getSkill(), this.skill)) {
				return true;
			}
		}
		return false;
	}

	@Override
	public int hashCode() {
		return Objects.hash(name, skill);
	}

}

测试代码

package MaEquals.RewriteEquals;

public class TestAnimals {
	public static void main(String[] args) {
    Animals tiger = new Animals();
    Animals cat = new Animals();
    System.out.println(tiger.hashCode()+"++++++"+cat.hashCode());
    System.out.println(tiger.equals(cat));
	}
}

结果

true

可以把代码重写的等于方法注释掉,然后测试发现输出错误。

但是重写后,得考虑一个正常问题:

hashcode不等,equals一定不相等.hashcode相等,equals可能相等,也可能不等。

但是为了Java的语言对equals的要求。所以hashcode需要重写保证相同。

然后重写hashcode

@Override
	public int hashCode() {
		return Objects.hash(name, skill);
	}

测试

    System.out.println(tiger.hashCode()+"++++++"+cat.hashCode());

结果

961 ++++++ 961

eclipse里面有快捷生成方式

在java文件里面右键---》source---》Generate hashCode and equals()...  注意生成的代码是否跟自已要实现的有差别没有。