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

 

 

 解释:

在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

posted @   真理不真  阅读(302)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示