高分悬赏:Java语言equals和hashcode的区别是什么?两个函数都必须编写么?
Java 的 equals 和 hashCode 是判断对象相等的基础方法,默认使用对象的哈希码来判断对象是否相等,equals 一般可以按业务等的逻辑来实现。
另外 hashCode 方法涉及到底层地址,不建议自己写,一般用IDE 的自动生成。
1) 只要重写 equals,就必须重写 hashCode。 2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写
这两个方法。
3) 如果自定义对象作为 Map 的键,那么必须覆写 hashCode 和 equals。
说明:String 因为重写了 hashCode 和 equals 方法,所以我们可以愉快地使用 String 对象作为 key 来使
用
先来看看在顶级父类Object中的源码:
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
本质上其实是两个不同的方法,equals()返回布尔值,hashCode()返回int值。
通俗点说:equals用于比较引用对象的值,hashCode返回引用对象的内存地址。
估计发问者是想知道自己写的类中,是否必须重写这两个方法。
不重写则无法迅速比较两个对象的某些特性。
广泛地说:肯定是按照业务逻辑来决定的。
个人的理解:
1. 只重写equals方法,但不重写hashCode时:可以使得在调用equals方法时,按照自己想要的逻辑返回比较结果;
2. 重写hashCode方法,对算法不熟悉的情况下,很容易造成及时每次运行返回的值是一样的(站在JMV的角度,依旧是两个不同的内存地址,但是由于你重写了hashCode方法,返回的hashCode会变成一样的值);
3. 如果要完整地保留哈希一致性,那不如用Object类的就好,或者你只是想返回自己想返回的hashCode值方便特定业务的实现(如果是这样,这个方法已经可以不用重写hashCode了).