java重写equals()方法和hashCode()方法

  • Post author:
  • Post category:java




java重写equals()方法和hashCode()方法



1.equals()方法和hashCode()方法是什么?

equals()和hashCode()都是是Java中万物之源Object类中的方法;

equals方法用于比较两个对象是否相同,Object类中equals方法的实现是比较引用地址来判断的对象是否是同一个对象,通过覆盖该方法可以实现自定义的判断规则;

hashCode是jdk根据对象的地址或者字符串或者数字计算该对象的哈希码值的方法。



2.为什么需要重写hashCode()方法和equals()方法?

首先,为什么要重写equals()方法。我们在定义类时,我们经常会希望两个不同对象的某些属性值相同时就认为他们相同,所以我们要重写equals()方法,按照原则,我们重写了equals()方法,也要重写hashCode()方法。

Java中的超类Object类中定义的equals()方法是用来比较两个引用所指向的对象的内存地址是否一致,Object类中equals()方法的源码:

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

Object类中hashCode()方法的源码:

public native int hashCode();

Object类中的hashCode()方法,用的是native关键字修饰,说明这个方法是个原生函数,也就说这个方法的实现不是用java语言实现的,是使用c/c++实现的,并且被编译成了DLL,由java去调用,jdk源码中不包含。对于不同的平台它们是不同的,java在不同的操作系统中调用不同的native方法实现对操作系统的访问,因为java语言不能直接访问操作系统底层,因为它没有指针。

  • 如果equals方法相等,则他们hsahcode的hash值必然相等,俩个对象必然相等

  • 如果equals方法不等,则他们hashcode的hash值不一定不等,俩个对象必然不等

  • 如果hashcode的hash值不等,则俩个对象必然不等

  • 如果hashcode的hash值相等,俩个对象不一定相等,要在判断equals是否相等来比较俩个对象是否相等。

    所以,需要同时重写equals方法和hashcode方法。

public class Student {
	private String name;
	private int age;
	
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	// 省略 get,set方法...
}

执行结果:

两位同学是同一个人吗?true
stu1.hashCode() = 71578563
stu1.hashCode() = 71578563

从 Student 类重写后的 hashcode() 方法中可以看出,重写后返回的新的 hash 值与 Student 的两个属性是有关,这样就确保了对象和对象地址之间的关联性。


一句话:实现了“两个对象 equals 相等,那么地址也一定相同”的概念!



版权声明:本文为Aaaaaaaaaaaaaaai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。