关于集合,实则是分为两大类的: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有什么区别会回答了吧