Set如何保证元素不重复
HashSet
- 基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap
- 封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的
key
来保存,而 HashMap 的 value 则存储了一个PRESENT
,它是一个静态的 Object 对象
- 当向HashSet中添加元素的时候,首先计算元素的hashcode值,然后通过扰动计算和按位与的方式计算出这个元素的
存储位置
,如果这个位置位空,就将元素添加进去;如果不为空,则用equals
方法比较元素是否相等,相等就不添加,否则找一个空位添加 - 允许null且只有一个
TreeSet
- TreeSet的底层是TreeMap的keySet(),而TreeMap是基于红黑树实现的,红黑树是一种平衡二叉查找树,它能保证任何一个节点的左右子树的高度差不会超过较矮的那棵的一倍
- TreeMap是按key排序的,元素在插入TreeSet时
compareTo()
方法要被调用,所以TreeSet中的元素要实现Comparable接口 - 不允许null值