Java - Hash - hashCode()与equal()

本文深入探讨Java中equals()与hashCode()方法的原理与应用,包括它们如何比较对象、如何实现哈希码计算以及在HashSet等集合类中的作用。通过解析这些方法的工作机制,读者能更好地理解Java对象的比较机制与集合类的内部工作原理。

首先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 。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值