在使用Set集合保存元素的时候,我们发现是不允许保存重复元素的。
如图所示,我们发现相重复的元素是不会被继续保存到Set集合中去的;这是为什么呢,就需要了解Set集合添加元素的原理。
如上图所示,add方法中底层使用的是map中的put方法。
在 putVal方法中我们可以看到用Node<k,v>数组来保存key和value;Node是HashMap的内部类;
在Node类中可以看到四个成员变量;其中hash代表哈希值;key代表我们存入的元素;next表示下一个元素地制值,体现了链表的结构。
由上述图片所知,Node<k,v>数组长度为16
可以简单的看作是把哈希值做了一个操作;找到新添加的元素在数组中的索引值位置,如果该索引值下没有元素,则直接添加该元素, 如果该索引值下有元素则比较哈希值,如果哈希值相同,则比较地址值或者进行equals比较;故哈希值相同且地址值或者equals比较相同则代表重复则不新增;否则可以新增。
则新增过程可以总结为:
新增过程:
1.计算新增元素的哈希值
2.哈希值%数组长度,计算出新增元素的索引值位置
如果该位置为null:则直接新增
如果该位置有元素:判断是否重复
重复:不新增
不重复:新增,挂到链表的最后位置
判断是否重复的标准:
a. 两个元素的哈希值相同 && (地址值相同 || equals相同)
当我们在Set集合新增自定义类元素时发现相同的元素还是可以添加进去,主要是由于我们没有覆盖重写hashCode方法和equals方法。当我们覆盖重写后:
就不会出现上述问题了。
所以我们在使用Set集合保存元素的时候,是不允许保存重复元素的。