【Java】超严谨论证:为什么自定义类对象存储到Set集合中,要重写hashCode方法和equals方法

本文详细论证了自定义类对象存储到Java的Set集合时,重写hashCode和equals方法的重要性。如果不重写,可能导致相同内容的对象被错误地存储多次,违反Set集合的唯一性原则。通过分析不同情况下hashCode和equals方法的行为,得出结论:只有重写这两个方法,才能确保Set集合按内容正确地判断元素重复,从而保证集合的正确性。
摘要由CSDN通过智能技术生成
前言

首先看一下Set集合在存储元素的时候,判断元素是否重复的方法:

  1. add方法首先调用元素的hashCode方法获取该元素的哈希值,再判断Set集合中有没有元素的哈希值与之重复。如果没有,就会把新的元素存储到数组中。
  2. 如果有重复的哈希值(哈希冲突),再调用元素的equals方法和Set中已有的哈希值相同的元素进行比较:
    如果equals方法返回true,认定两个元素相同,就不会把新元素存储到集合中;
    如果equals方法返回false,则认定两个元素内容不同,就会把新元素存储到集合中,放在同一个哈希值下形成链表。

那么如果一个自定义类对象不重写hashCode方法和equals方法就add到Set集合中,会发生什么情况?

  PS:论证之前需理解“哈希冲突”的概念,可参考我之前写的一篇文章。简单地说就是字符串“重地”和“通话”的哈希值是相同的。

论证

  假设有两个不同的自定义类对象p1、p2:

  1. 自定义类没有重写hashCode方法:
      • p1、p2存储的数据相同,p1、p2哈希值不同(这时不再调用对象的equals方法),两者都能存储到Set集合中(不合理,Set集合元素不能重复)。
        注:1. 如果自定义类没有重写hashCode方法,无论p1、p2存储的数据相同或不相同ÿ

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值