11.a.hashcode() 有什么用?与 a.equals(b)有什么关系?

1 hashCode

hashcode()方法提供了对象的hashCode值,是一个native方法,返回的默认值与System.identityHashCode(obj)一致。

public class Object {
	public native int hashCode();
}

通常这个值是对象头部的一部分二进制位组成的数字,具有一定的标识对象的意义存在,但绝不定于地址。

作用是:用一个数字来标识对象。比如在HashMap、HashSet等类似的集合类中,如果用某个对象本身作为Key,即要基于这个对象实现Hash的写入和查找,那么对象本身如何实现这个呢?就是基于hashcode这样一个数字来完成的,只有数字才能完成计算和对比操作。

2 hashcode是否唯一

hashcode只能说是标识对象,在hash算法中可以将对象相对离散开,这样就可以在查找数据的时候根据这个key快速缩小数据的范围,但hashcode不一定是唯一的,所以hash算法中定位到具体的链表后,需要循环链表,然后通过equals方法来对比Key是否是一样的。

3 equals与hashcode的关系

equals相等两个对象,则hashcode一定要相等。但是hashcode相等的两个对象不一定equals相等。
为什么?我们看一下Long的hashCode,和equals方法。

public final class Long extends Number implements Comparable<Long> {
    public static int hashCode(long value) {
        return (int)(value ^ (value >>> 32));
    }
    
    public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
        }
        return false;
    }
}

我们可以看到不同的value经过 (int)(value ^ (value >>> 32)) 操作之后hashCode可能会是一样的。但是Long中, x.equals(y) == true,那么他的hashcode一定会一样。如果遇到hash冲突(hash)值一样,需要遍历链表,通过equals方法来判断是否一样。hashcode一样不能说明两个对象equals一样。

参考文档

《Java的hashcode与equals方法》:https://segmentfault.com/a/1190000004520827

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值