Set
集合的最大特点是能够保证内部的元素唯一性. 这种特性是建立在Map
的基础上的. 换句话说: Set
通过组合的模式, 在Map
的基础上扩展了一些特性. 由于Set
是建立在Map
的基础上的. 如果理解了Map
的话, Set
会很好理解. 接下来我们来看看Set
家族的UML
UML
Set
接口对应Map
接口, 定义了Set
的一些方法. AbstractSet
对应AbstractMap
, 为Set
家族提供了一些默认的实现. HashSet
通过组合HashMap
并且利用HashMap
的Key值的唯一性, 来保证内部元素的唯一性. LinkedHashSet
通过组合LinkedHashMap
, 使得Set内部的元素是有序的. 同种道理, TreeSet
也是基于TreeMap
来实现的.
Set家族
HashSet
LinkedHashSet
TreeSet
HashSet
|
|
前面说过Set
家族都是通过组合Map
家族来实现的. 从上面的字段, 可以看出HashSet
是基于HashMap
来实现的. 而PRESENT
则是一个虚假的值.
|
|
当向HashSet
中添加元素时, 将元素作为map的key, 而value则是用一个虚假的值PRESENT
. 由于HashMap
中的Key是唯一的. 而HashSet
中的元素是作为Key储存在HashMap
中的.这样就保证了HashSet
元素中没有重复的值.
LinkedHashSet
LinkedHashSet
继承于HashSet
, 它对应Map
家族的LinkedHashMap
. 但是当你查看LinkedHashSet
的时候, 可能会发现并没有LinkedHashMap
.
|
|
上面这个构造函数是HashSet
为LinkedHashSet
预留的.
|
|
`LinkedHashSet
中还提供了一个迭代器接口, 迭代器遍历时是有序的遍历. 因为该迭代器是LinkedHashMap
的一个实现.
TreeSet
TreeSet
对应于TreeMap
, TreeSet
的实现思路跟前面两个Set
差不多.. 这里不分析.
最后
到这里…不知不觉已经分析完了集合框架. 但是并没有包含并发的集合工具. 接下来准备看完并发后再来梳理并发集合工具.