equals()和hashcode()总结(一)

本文详细解析了Java中equals()与hashCode()方法的重要性及其实现原则,强调了在覆写equals()时必须同时覆写hashCode()的原因,并介绍了它们在Map和Set中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、任何class如果覆写了equals()方法,就必须覆写hashCode()。

2. map是根据equals()和hashCode()来判断对象是否相等,所以在类里覆写了equals(),就一定要覆写hashCode()。
关于Hashtable,判断key是否相同的条件是:hashCode()相同 && 满足equals(),而一个类如果没有覆写equals()方法,
那么这个类的equals方法比较的是对象的内存地址。如果没有覆写HashCode,那么该类的hashCode是通过对象的内存地址转换而来.

3. 在程序执行期间,同一个对象调用hashCode()必须返回同一个值(同一个应用执行期)。
散列码不必是独一无二的(应该更关注生成速度,而不是唯一性),但是通过hashCode()和equals(),
必须完全能够确定对象。

4. 如果两个对象equals,那么他们的hashCode()必须相等。

5. Map.put(key,value)时根据key.hashCode生成一个内部hash值,根据这个hash值将对象存放在一个table中。
Map.get(key)会比较key.hashCode和equals方法,当且仅当这两者相等时,才能正确定位到table;
java中Set是通过Map实现的,所以Map和Set的所有实现类都要注意这一点.

6. 如果想判断是否两个对象引用指向同一个实体,唯一的正确途径是使用==,因为只有它不会被重构,要慎用hashCode。

7. 有一点我们应该是能够确认的,就是同样的数字转换成hashCode后的值肯定一样,
因此我们在覆写hashCode时候应该利用自己编写的类独特属性进行hashCode运算(当然不仅仅是一个属性,可以是多个属性),
这样我们就可以尽量的保证每个类对象的具有不同的hashCode,如果这些不同的对象有机会进入同一个map的时候就可以保证其hashCode不一样,
从而提高map的检索。

8. 有关hashCode()计算

boolean c=(f ? 0 : 1)

byte,char,short, int c=(int)f

long c=(int)(f^(f>>>32))

float c=Float.floatToIntBits(f);

double long l = Double.doubleToLongBits(f);
c=(int)(l^(l>>>32))

Object c=f.hashCode()

//
int f = 17;
result = 37*result + c;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值