首先equals()和hashCode()都是从object类中继承过来的。
一、equals()
public boolean equals(Object obj){
return (this == obj);
}很明显,equals()是对两个对象引用的比较,即内存地址值的比较。
但为什么大家都说:==是比较地址,equals()是比较对象的内容?
因为,String 、Math、Integer和Double等封装类在使用equals()方法时,已经覆盖了object类的equals(),只比较内存地址中的指。
二、hashCode()
<span style="font-size:14px;"> public native int hashCode(); </span>说明hashCode()是一个本地方法,本地方法就是用关键字native修饰的方法,通过这些方法可以调用java以外的程序,例如c语言写的程序,它的实现是根据本地机器相关的。
同样的,String、Integer、Double等类都是重写了hashcode()方法
例如String类中的hashCode()方法如下:
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
} <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
这里使用的是 int 算法:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] ,其中 s[i] 是指字符串中的第 i 个字符,n 是字符串的长度,^ 表示求幂。所以,空字符串的哈希码为 0 。
三、hashCode()与equal()
1、equals()返回true,hashcode()一定相等。
【分析】
在object类中,hashcode()方法返回的是对象的地址值,equals()方法比较的是两个对象的地址值。如果equals()相等,说明两个
对象地址值也相等,当然hashcode()也就相等了。
在String类中,equals()返回的是两个对象内容的比较,而String类的hashCode()是根据String的内容来计算的,所以两个相同字
符串的hashcode()返回值也会相等。
同理,Integer、Double等封装类中经过重写的equals()和hashcode()方法也同样适合于这个原则。
2、equals()返回false,hashcode()有可能相等。(哈希码冲突)
3、hashcode()不等,equals()一定返回false。
4、hashcode()相等,equals()可能false。(哈希码冲突)
四、HashSet与hashCode()
Hashset中不允许出现重复对象,元素的位置也是不确定的,那么在hashset中怎样判定元素是否重复的呢?
Java集合中,判断两个对象是否相等的规则
第一步:调用hashCode(),判断两个对象的哈希值是否相等;
第二步:调用equals(),判断是否返回true 。
本文深入探讨Java中equals()与hashCode()方法的原理与应用,包括它们如何比较对象、如何实现哈希码计算以及在HashSet等集合类中的作用。通过解析这些方法的工作机制,读者能更好地理解Java对象的比较机制与集合类的内部工作原理。
766

被折叠的 条评论
为什么被折叠?



