java重写equals和hashcode方法分析

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

但是对象自带的等于方法,是用==比较的,比较的对象引用,但是不一定是一个对象地址,也有相同属性内容,业务需要让他俩等于相同,所以就需要重写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()...  注意生成的代码是否跟自已要实现的有差别没有。

猜你喜欢

转载自blog.csdn.net/mint6/article/details/80869315