一、Set集合体系
二、HashSet
Hash算法请见: www.jianshu.com/p/bf1d7eee2…
(1)HashSet特点:
- HashSet集合以Hash算法存储元素,具有很好的存取和查找功能
- HashSet不是同步的,也就是说当多个线程同时访问一个HashSet时,必须通过代码实现同步
- HashSet可以添加null
- HashSet判断两个元素相同的标准是equals()方法和hashCode()判断结果统一
三、 LinkedHashSet
LinkedHashSet与HashSet的区别是,它会使用链表记录元素被添加的位置,在遍历集合时效率更高。
四、 TreeSet
TreeSet是SortedSet接口的实现类,它会将所添加元素排序后进行存储。排序方式可以是自然排序,也可以是定制排序。它内部使用红黑树结构存储元素。
另外它额外添加了如下方法:
Object first();
返回集合中的第一个元素Object last();
返回集合中的最后一个元素Object lower(Object e);
返回集合中位于e之前的元素(e可以是非集合内元素)Object higher(Object e);
返回集合中位于e之后的元素(e可以是非集合内元素)SortedSet subSet(Object from,Object to);
返回范围从from(包含)到to(不包含)的Set集合的子集SortedSet headSet(Object to);
返回此Set集合的子集,由小于to的元素组成SortedSet tailSet(Object from);
返回此Set集合的子集,由大于from的元素组成Cpmparator comparator();
如果TreeSet采用了定制排序,则此方法返回定制排序所用的Comparator,否则返回null。
方法展示:
注意:添加到TreeSer集合中的元素必须已经实现了Comparable接口(有一个compareTo(Object obj)方法),且所添加的元素属于同一个类。否则,运行时会报异常
(1)TreeSet中的自然排序
Java语言中以实现Comparable接口的类如下:
- BigDecimal、BigInteger和所有的数值类的包装类
- Character类
- String类
- Date、Time类
- Boolean类
默认按升序排列
(2)TreeSet中的定制排序
要实现TreeSet的定制排序,需要在d定义TreeSer时提供一个Comparable(函数式接口,可接受Lambda表达式)对象与该集合关联。
五、EnumSet
EnumSet是一个保存枚举类的枚举值的集合,其内部以位相量的形式存储,进行批量操作时执行速度快。(containsAll()、retainAll())
EnumSet不可以保存null值,且没有暴露构造器实例化。可通过一下方法创建实例:
EnumSet allOf(Class enumClass);
包含指定枚举类的所有枚举值EnumSet complementOf(EnumSet s);
包含枚举类中没有被s包含的枚举值EnumSet copyOf(Collection c);
以一个普通集合创建EnumSet对象EnumSet noneOf(Class elementType);
创建一个元素类型指定为枚举类型的空集合EnumSet of(E first...E last);
创建一个包含指定枚举值的枚举集合EnumSet range(E from, E to)
;同上
六、Set集合总结
HashSet(Hash算法存储集合元素)和TreeSet是Set集合的典型实现,HashSet的添加、查询效率高,但是需要对集合中的元素排序则使用TreeSet(红黑树存储集合元素)。LinkedHashSet(Hash算法存储集合元素,外加链表记录插入顺序)在遍历的时候效率较高,因为,底层另外使用链表记录插入的顺序。EnumSet采用位向量的数据结果存储元素,性能最好。但是只能保存同一个枚举类的枚举值。