hashMap存储结构(key为对象时 为什么要重写对象的hashCode() 和equal()方法

本文解析了在HashMap中为何必须重写hashCode()和equals()方法。解释了这两个方法的基本原理,以及它们如何影响对象的比较和散列值的一致性。

解释:

在HashMap中,如果key为类对象,则必须要重写hashCode() 和equal()这两个方法。           Why? 首先了解下未被重写的hashCode() 和equal()方法。

1.未被重写的hashCode() 和equal()方法

     HashCode是根类Obeject中的方法。如果对象不重写该方法,默认情况下 返回相应对象的32为JVM内存地址。

     equals()用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类中的equals方法内部使用的就是 == 比较运算符。

2.在HashMap中,判断两个对象(key)是否相等的规则:

  2.1.判断两个对象的hashCode()是否相等

      如果不相等,认为两个对象也不相等,完毕

      如果相等,转入2.2

  2.2.判断两个对象的equals()是否相等

      如果不相等,认为两个对象也不相等

      如果相等,认为两个对象相等

3.为什么重写hashCode方法?

  一般的地方不需要重写hashCode(),只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重写hashCode(),那么为什么要重写hashCode()呢?

  如果不重写hashCode()方法,由于两个对象实例的内存地址不同,根据2.1,则判为不等。

  重写之后,hashCode()方法变成判断其逻辑上是否相同,根据2.1,则判为相等。

4.为什么要重写equal方法?

  因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重写equal方法。
 

5. 为什么string 不需要重写hashcode和equals方法?

    String 对象底层是一个 final 修饰的 char 类型的数组,hashCode() 的计算是根据字符数组的每个元素进行计算的,所以内容相同的 String 对象会产生相同的散列码。

     而非 String类型的对象 在获得对应的 value 时需要的条件太过苛刻,首先要保证散列码相同,并且经过 equals() 方法判断为 true 时才可以获得对应的 value

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值