HashSet自定义元素类型的重复判定问题

HashSet是无重复的集合,那么问题就是如何判定一个元素是否和另一个元素是相等的。这里需要自定义相等性。当有对象加入HashSet时,首先java会通过对象的hashcode值来判断对象加入的位置及是否有重复的hashcode。如果没有重复的hashcode就认为没有相同的对象。如果有重复的hashcode,会再调用equals()方法判断有重复hashcode的两个对象是否真的相等。如果相等那么HashSet就知道要加入的项目已经重复了,加入的操作就不会发生。相等性有两个层次

  1. 引用相等性: 如果只认为引用指向同一个对象才算相等,那么什么都不用做。对引用调用hashCode()会返回引用指向的对象特有的序号(大部分是对对象在堆上的地址的映射,因此不会有重复的序号。但也有像String一样的其实是字面值的映射)
  2. 对象相等性:如果实际需要把不同的对象视为相等的,需要覆盖从Object继承下来的hashCode()才能确保两个对象有相同的hashcode,然后需要覆盖equals()方法。之所以需要有equals()方法是因为hashcode相同的对象未必相同,hashCode()所使用的杂凑算法可能会凑巧让多个对象返回相同的杂凑值,但这种情况也比较少,所以equals其实很少会被调用。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java集合 1、集合的由来 程序的需求也许并不能确定创建对象的数量,甚至不知道对象的类型,为了满足普适的编程需要...
    小灰灰_5c75阅读 1,021评论 0 0
  • java.lang.Object类中有两个非常重要的方法: 1publicbooleanequals(Object...
    小陈阿飞阅读 697评论 1 1
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,731评论 0 11
  • 很久以前听一个讲座,演讲者是一个辛苦读书然后写作最终从山里走出来的人。那个时候她上大学的钱是妹妹打工攒的。后来他事...
    抱猫码字阅读 217评论 1 4
  • 走进郑波集团河南连村饮品有限公司, 连村饮品业务精英 走进连村饮品有限公司 职工餐厅,住宿楼 会议室,办公,产品展示
    欧王阅读 183评论 0 0