关于集合,实则是分为两大类的:List
和 Set
,Map
只是另类的集合,并不是 Collection
类的一个子类。List
不去重,Map
是键值对,而 Set
则是去重的无序列表。Set
的各个实现类基本都是借助 Map
来实现的,基本原理都一样,这里以 HashSet
为例,其它的实现类可以举一反三。
注:本文基于jdk_1.8.0_162
HashSet
内部结构
总览
HashSet
的实现依赖于 HashMap
,以其 Key
来存储数据,并以一个固定值在 Value
位置占位,用来实现其去重及无序特性。
主要成员
主要成员如下:
1 | public class HashSet<E> extends AbstractSet<E> |
构造方法
1 | //默认构造器 |
是不是很惊喜,HashSet
竟然这么偷懒,直接使用了 HashMap
来存储元素。
重点方法
1 | public int size() { |
看,没错了,就是这么简单,初始化了 HashMap
之后,主要的方法实现全靠 HashMap
来实现。是偷懒了,但是很巧妙。
总结
HashSet
实际就是全用HashMap
的现成方法来实现的Set
用Map
的Key
来存储元素,并将其Value
用一个Object
来占位- 一样原理,
LinkedHashSet
和TreeSet
是用LinkedHashMap
和TreeMap
来实现的 HashMap
实现原理可参考:Java集合分析之Map-从HashMap说起LinkedHashMap
和TreeMap
实现原理可参考:Java集合分析之Map-这个Map有顺序(LinkedHashMap & TreeMap)- 这下子别人再问
HashMap
和HashSet
有什么区别会回答了吧