Set 接口继承于 Collection 接口,它类似于数学中集合的概念,元素是无序的且不允许重复。除了最基础的添加,删除,修改元素等操作以外,Set 还可以求 Union, Intersection, Difference.
Image Source
|
|
Set 接口主要有这些实现类:HashSet
, LinkedSet
, TreeSet (sorted)
, EnumSet
下面我们来一一分析
HashSet
HashSet 有如下几个特点:
- 不允许重复元素
- 插入元素时并不按照插入的先后顺序排列,而按照 hash code 排
null
允许存在于 HashSet 中- 底层运用的是 Hashtable 算法
HashSet 中有这么几个构造器
Source: Oracle 官方文档
如果不传参数,default 容量为16,load factor 为0.75. 即当 HashSet 中有 16 * 0.75 = 12 个元素时,底层的算法会使容量翻倍。当然,HashSet 也提供了一个构造器让用户自定义 default capacity 和 load factor.
HashSet 常用方法有 add()
, remove()
, contains()
, clear()
, iterator()
LinkedHashSet
LinkedHashSet 是 HashSet 的 ordered 版本,向其中添加的元素都是有先后顺序的。它底层使用 Doubly Linked List 来组织 HashSet。它实现了 Set 接口且继承于 HashSet 类。
代码示例如下
TreeSet
TreeSet 有如下特点:
- TreeSet 实现了 NavigableSet,NavigableSet 又继承了 SortedSet
- 不允许重复元素
- 元素不以添加先后顺序排列,而是按照 key 排序
- TreeSet 不允许添加不同 class 的对象
TreeSet 允许添加
null
, 但有且仅有一次构造器有这么几种
1234567891011TreeSet()/*Constructs a new, empty tree set, sorted according to the natural ordering of its elements.*/TreeSet(Collection<? extends E> c)/*Constructs a new tree set containing the elements in the specified collection, sorted according to the natural ordering of its elements.*/TreeSet(Comparator<? super E> comparator)/*Constructs a new, empty tree set, sorted according to the specified comparator.*/TreeSet(SortedSet<E> s)/*Constructs a new tree set containing the same elements and using the same ordering as the specified sorted set.*/
Source:Oracle 官方文档
针对 TreeSet 有如下操作
向其中添加元素
|
|
向其中添加 null
|
|
如果 TreeSet 中已经有了元素,再试图向其中添加 null
时,编译器会报错 Throw NullPointerException
因为每次向 TreeSet 中添加元素,它都会与已经存在的元素比较,看它们是否是一类 class,如果向其中添加 null
, 而 null
不属于任何一个 class,所以会报错
正确的做法是第一个就添加 null
, 但此后就不能添加任何其他元素了
TreeSet 常用操作
关于 Set 接口及其实现类的讨论就到这里
以上内容如有疏漏或不足之处,欢迎与我讨论
邮箱:entropy714@gmail.com
微信:cobain0714