【Java】重写equals()和hashCode()方法的原因和例子

 /**
     * Returns a hash code value for the object. This method is
     * supported for the benefit of hash tables such as those provided by
     * {@link java.util.HashMap}.
     * ...
     */
    public native int hashCode();
    
	public boolean equals(Object obj) {
        return (this == obj);
    }

概要解释如下

在java应用程序运行时,无论何时多次调用同一个对象时的hsahCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值。

因此有如下原则:

原则A:如果两个对象equals()返回值为true,则他们的hashCode()也必须返回相同的int值.

原则B:如果两个对象equals()返回值为false,则他们的hashCode()返回值也必须不同.

应用场景一

在定义类时,会希望两个不同对象的属性值相同时就认为它们相同。所以要重写equals()方法,按照原则,重写了equals()方法,也要重写hashCode()方法,要保证上面所述的A,B原则。所以java中的很多类都重写了这两个方法,例如String类、包装类等。

应用场景二

HashSet存放元素时,根据元素的hashCode值快速找到要存储的位置。添加元素时,如果两个对象的hashCode()返回值不同,直接添加;如果两个对象的hashCode()返回值相同,两个对象会通过equals()比较,如果返回值为true,则不放入;如果返回值为false,则这个时候会以链表的形式在同一个位置上存放两个元素(7上8下)。

例子

public class Student {

	private String name;

	private Integer age;

	public Student(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public boolean equals(Object obj) {
		// 如果为同一对象的不同引用,则相同
		if (this == obj) {
			return true;
		}
		// 如果传入的对象为空,则返回false
		if (obj == null) {
			return false;
		}

		// 如果两者属于不同的类型,不能相等
		if (getClass() != obj.getClass()) {
			return false;
		}

		// 类型相同, 比较内容是否相同
		Student other = (Student) obj;

		return name == other.name && age == other.age;
	}

	@Override
	public int hashCode() {
		int result = 17;
		//同一属性的值相同,那它们的哈希值也相同
		result = 31 * result + (name == null ? 0 : name.hashCode());
		result = 31 * result + (age == null ? 0 : age.hashCode());
		return result;
	}

}
public class EqualsDemo {
	
	public static void main(String[] args) {
		Student stu1 = new Student("awu", 22);
		Student stu2 = new Student("awu", 22);
		Student stu3 = new Student("gy", 22);
		
		System.out.println(stu1.equals(stu2));
		System.out.println(stu1.equals(stu3));
		System.out.println(stu2.equals(stu3));
		
		System.out.println(stu1.hashCode());
		System.out.println(stu2.hashCode());
		System.out.println(stu3.hashCode());
	}
	
}

结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值