作者 | petterp

来源 | https://blog.csdn.net/petterp/article/details/89043847

先来说一下hashcode()和equals方法吧。

hashcode()

  1. hashCode 的存在主要用于查找的快捷性,如 Hashtable, HashMap 等,hashCode 是用来在三列存储结构中确定对象的存储地址的。

  2. 如果两个对象相同,就是适用于 euqals(java.lang.Object) 方法,那么这两个对象的 hashCode一定相同。

  3. 如果对象的euqals 方法被重写,那么对象的 hashCode 也尽量重写,并且产生 hashCode 使用的对象,一定要和 equals 方法中使用的一致,否则就会违反上面提到的第二点。

  4. 两个对象的 hashCode 相同,并不一定表示这两个对象就相同,也就是不一定适用于equals() 方法,只能够说明这两个对象在三列存储结构中,如 Hashtable.,他们存在同一个篮子里。以上话以前摘录自一篇博客,讲的非常好。

equals(Object obj)

  1. 如果一个类没有重写 equals(Object obj)方法,则等价于通过 == 比较两个对象,即比较的是对象在内存中的空间地址是否相等。

  2. 如果重写了equals(Object ibj)方法,则根据重写的方法内容去比较相等,返回 true 则相等,false 则不相等。

我用一个简单的demo来举个例子吧.

public class MyClass {public static void main(String[] args) {HashSet books=new HashSet();books.add(new A());books.add(new A());books.add(new B());books.add(new B());books.add(new C());books.add(new C());System.out.println(books);}
}
class A{//类A的 equals 方法总是返回true,但没有重写其hashCode() 方法@Overridepublic boolean equals(Object o) {return true;}
}
class B{//类B 的hashCode() 方法总是返回1,但没有重写其equals()方法@Overridepublic int hashCode() {return 1;}
}
class C{public int hashCode(){return 2;}@Overridepublic boolean equals(Object o) {return true;}
}

结果

  1. 即使两个A 对象通过 equals() 比较返回true,但HashSet 依然把他们当成 两个对象,即使两个 B 对象 的hashCode() 返回值相同,但HashSet 依然把他们当成两个对象。

  2. 即也就是,当把一个对象放入HashSet 中时,如果需要重写该对象对应类的 equals() 方法,则也应该重写其 hashCode() 方法。规则是:如果两个对象通过 equals() 方法比较返回true,这两个对象的 hashCode 值也应该相同。

  3. 如果两个对象通过euqals() 方法比较返回true,但这两个对象的 hashCode() 方法返回不同的hashCode 值时,这将导致HashSet 会把这两个对象保存在 Hash 表的不同位置,从而使两个对象都可以添加成功,这就与 Set 集合的规则冲突了。

  4. 如果两个对象的 hashCode() 方法返回的 hasCode 值相同,但他们通过 equals() 方法比较返回false 时将更麻烦:因为两个对象的hashCode 值相同,HashSet 将试图 把它们保存在同一个位置,但又不行(否则将只剩下一个对象),所以实际上会在这个位置用链式结构来保存多个对象;而HashSet 访问集合元素时也是根据元素的 hashCode 值来快速定位的,如果 hashSet 中两个以上的元素具有相同的 HashCode 值时,将会导致性能下降。

用Object做hashMap的Key时需要做什么?

用自定义类作为key,必须重写equals()和hashCode()方法。

自定义类中的equals() 和 hashCode()都继承自Object类。

往期推荐

摊牌了,这些全是假的!埋了4个月的彩蛋都没被发现...

Stack Overflow 最火的一段代码竟然有 Bug...

居然有人提问“国家何时整治程序员的高薪现象”?

为什么不推荐使用 stop、suspend 方法中断线程?

阿里6000人发布联合倡议书:杜绝涉黄游戏和丑陋酒桌文化,HR不唯上、应更向人看!

喜欢本文欢迎转发,关注我订阅更多精彩

关注我回复「加群」,加入Spring技术交流群

蔚来一面:用Object做hashMap的Key时需要做什么?相关推荐

  1. java hashmap替换key,HashMap 用可变对象作为 key 踩坑

    点击上方☝ Java编程技术乐园,轻松关注! 及时获取有趣有料的技术文章 做一个积极的人编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 作者:Icharle https://icharl ...

  2. hashmap 允许key重复吗_HashTable和HashMap的区别详解

    一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的, ...

  3. hashmap 允许key重复吗_搞懂 HashMap,这一篇就够了

    HashMap 概述 「如果你没有时间细抠本文,可以直接看 HashMap 概述,能让你对 HashMap 有个大致的了解」. HashMap 是 Map 接口的实现,HashMap 允许空的 key ...

  4. 对象作为HashMap的key

    在实际使用中如果遇到对象作为HashMap结构的key,则一定要注意重写equals和hashCode两个方法.以JDK8为例,HashMap在put(K key, V value)方法和contai ...

  5. hashmap 允许key重复吗_Java HashMap key 可以重复吗?

    Java HashMap key 可以重复吗? Java的HashMap中key是不可以重复的,如果重复添加的话,HashMap会自动覆盖key一样的数据,保证一个key对应一个value,使用时只要 ...

  6. hashmap计算hashcode时为什么要把高位右移16位

    写在前面: 1.如有错误请看官斧正. 2.建议把例子复制出去,自己用各种位运算算一下,然后也像我这样把异同处标出来,这样能在自己计算的过程中有更深的领悟. 一.hashmap计算hashcode时为什 ...

  7. 初级开发人员的缺点_这是我想放弃初级开发人员时所做的事情

    初级开发人员的缺点 Coding is hard. Really hard. There are times when you'll think "this is amazing! I lo ...

  8. SAP PP 为工单确认时自动做收货的设置

    SAP PP 为工单确认时自动做收货的设置 TCode: OP67 Micro Message: JINYULIN_SH_

  9. SAP HUM对嵌套HU做WM货物移动时TO单上只显示外层HU

    SAP HUM对嵌套HU做WM货物移动时TO单上只显示外层HU 在使用了嵌套HU的场景里,如果是对某嵌套HU做WM层面的货物移动,则相关TO单据上的SU号码一般都是外层HU号码,内层HU号码不会体现在 ...

最新文章

  1. 解决Wireshark 服务运行于非默认端口问题
  2. 关于reference to ‘XXXX’ is ambiguous的解决办法
  3. ACM 中常用的算法有哪些?
  4. RIP路由协议快速入门(二)
  5. react不同环境不同配置angular_DevOps 前端项目(angular、vue、react)打包静态资源生成一份Docker镜像支持部署不同环境...
  6. Java 连接各种数据库
  7. Spring Cloud Alibaba基础教程:@SentinelResource注解实现限流控制与熔断降级使用详解
  8. Mac下安装多版本python
  9. CreateFileMapping共享内存时添加Global的作用
  10. php中trim的用法和例子,PHP ltrim()用法及代码示例
  11. taskkill无法终止进程 拒绝访问_解决删除文件时,提示无法删除的问题
  12. 怎么在Java里辨别小数_求教java中如何判断一个数是不是小数,求详细代码及解释...
  13. 200 300的完数 c语言,C语言求完数(完全数)(详解版)
  14. 开课吧:常见的数据可视化分析工具有哪些?
  15. Linux抓包命令tcpdump
  16. hadoop系列-hadoop版本选择
  17. 从入门到入土:Python实现爬取网易云歌词|评论生成词云图
  18. 良心教程教你如何使用Excel简单绘制数据图表。
  19. apache评分表的意义_APACHE-II评分系统表.doc
  20. arp攻击----arpspoof

热门文章

  1. 关于hibernate的实体类中有集合类型转化成JSON的工具类 - 怀念今天的专栏 - 博客频道...
  2. php字符串处理函数大全
  3. (原创)datagrid数据导出到excel文件给客户端下载的几种方法
  4. 使用druid连接池的超时回收机制排查连接泄露问题
  5. 解决程序与mysql的乱码问题
  6. linux c 获取文件行数
  7. linux 查看磁盘分区的文件系统格式
  8. centos7 安装 xfce桌面
  9. python3 元组 tuple 操作
  10. smarty实例教程