数据结构之Set
# Set集合
Set 继承于 Collection 接⼝,是⼀个不允许出现重复元素,并且⽆序的集合,主要 HashSet 和 TreeSet 两⼤实现类。 在判断重复元素的时候,HashSet 集合会调⽤ hashCode()和 equal()⽅法来实现;TreeSet 集合会调 ⽤compareTo⽅法来实现。
# HashSet
# 介绍
HashSet 是哈希表结构,主要利⽤ HashMap 的 key 来存储元素,value为一个静态常量Object,计算插⼊元素的 hashCode 来获取元,素在集合中的位置; 此类允许null元素。
# 拓展
- LinkedHashSet,基于LinkedHashMap,实现保证插入的顺序和输出的顺序是一样的。
- ConcurrentHashSet,一个线程安全的
# TreeSet
# 介绍
与HashSet不同的是,TreeSet具有排序功能,分为自然排序(123456)和自定义排序两类,默认是自然排序;在程序中,我们可以按照任意顺序将元素插入到集合中,等到遍历时TreeSet会按照一定顺序输出--倒序或者升序;
它继承AbstractSet,实现NavigableSet, Cloneable, Serializable接口。
(1)与HashSet同理,TreeSet继承AbstractSet类,获得了Set集合基础实现操作;
(2)TreeSet实现NavigableSet接口,而NavigableSet又扩展了SortedSet接口。这两个接口主要定义了搜索元素的能力,例如给定某个元素,查找该集合中比给定元素大于、小于、等于的元素集合,或者比给定元素大于、小于、等于的元素个数;简单地说,实现NavigableSet接口使得TreeSet具备了元素搜索功能;
(3)TreeSet实现Cloneable接口,意味着它也可以被克隆;
(4)TreeSet实现了Serializable接口,可以被序列化,可以使用hessian协议来传输;
具有如下特点:
- 对插入的元素进行排序,是一个有序的集合(主要与HashSet的区别)
- 底层使用红黑树结构,而不是哈希表结构
- 允许插入Null值
- 不允许插入重复元素
- 线程不安全
# 拓展
- SortedSet,一个有序Set的接口,是所有有序集合的父类。
# CopyOnWriteArraySet
基于CopyOnWriteArrayList实现,每次添加都会去遍历LIst中是否存在元素,如果存在则不添加。