前言
首先看一下Set集合在存储元素的时候,判断元素是否重复的方法:
- add方法首先调用元素的hashCode方法获取该元素的哈希值,再判断Set集合中有没有元素的哈希值与之重复。如果没有,就会把新的元素存储到数组中。
- 如果有重复的哈希值(哈希冲突),再调用元素的equals方法和Set中已有的哈希值相同的元素进行比较:
如果equals方法返回true,认定两个元素相同,就不会把新元素存储到集合中;
如果equals方法返回false,则认定两个元素内容不同,就会把新元素存储到集合中,放在同一个哈希值下形成链表。
那么如果一个自定义类对象不重写hashCode方法和equals方法就add到Set集合中,会发生什么情况?
PS:论证之前需理解“哈希冲突”的概念,可参考我之前写的一篇文章。简单地说就是字符串“重地”和“通话”的哈希值是相同的。
论证
假设有两个不同的自定义类对象p1、p2:
-
自定义类没有重写hashCode方法:
• p1、p2存储的数据相同,p1、p2哈希值不同(这时不再调用对象的equals方法),两者都能存储到Set集合中(不合理,Set集合元素不能重复)。
注:1. 如果自定义类没有重写hashCode方法,无论p1、p2存储的数据相同或不相同ÿ