在 Java 的 Set 体系中,根据实现方式不同主要分为两大类。HashSet 和 TreeSet。
1、TreeSet 是二叉树实现的,Treeset 中的数据是自动排好序的,不允许放入 null 值
2、HashSet 是哈希表实现的,HashSet 中的数据是无序的,可以放入 null,但只能放入一个 null,两者中的值都不能重复,就如数据库中唯一约束。
在 HashSet 中,基本的操作都是有 HashMap 底层实现的,因为 HashSet 底层是用HashMap 存储数据的。当向 HashSet 中添加元素的时候,首先计算元素的 hashcode值,然后通过扰动计算和按位与的方式计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用 equals 方法比较元素是否相等,相等就不添加,否则找一个空位添加。
TreeSet 的底层是 TreeMap 的 keySet(),而 TreeMap 是基于红黑树实现的,红黑树是一种平衡二叉查找树,它能保证任何一个节点的左右子树的高度差不会超过较矮的那棵的一倍。
TreeMap 是按 key 排序的,元素在插入 TreeSet 时 compareTo()方法要被调用,所以 TreeSet 中的元素要实现 Comparable 接口。TreeSet 作为一种 Set,它不允许出现重复元素。TreeSet 是用 compareTo()来判断重复元素的。