###Set集合元素为什么不重复,是如何实现不重复的?
对于基本数据类型特征的数据,Set集合可以直接比较是否相等,相等就去掉重复。
对于引用数据类型的数据,Set集合将会按照如下流程判断是否重复:
Set集合每次添加元素的时候,会自动提取两个对象。
然后让两个对象调用自己的hashCode()方法(继承自Object)得到彼此的哈希值(所谓的内存地址)
然后判断两个对象的哈希值是否一样,如果不一样认为两个对象不重复,都保留。
如果两个对象的哈希值一样,Set集合会继续让两个对象进行equlas比较,
如果equlas比较结果不一样,则认为两个对象不重复,都保留。
如果equlas比较结果一样,则认为两个对象重复,保留一个。
###HashSet集合的元素为什么是无序的,是如何实现元素无序的。
因为set集合底层是基于哈希表存储的。
jdk1.8之前,哈希表是由:数组和链表组成的,
jdk1.8之后,哈希表是由:数组+链表+排序二叉树组成
JDK 1.8之后,如果链表的长度超过或者等于了阈值(7)的时候会自动转成红黑树,性能进一步提高了
二叉树:只有一个个节点,两个分节点。
排序二叉树:小在左,大在右。
(以上只基于个人总结,仅供参考)