1.首先我们常用的Map和List是出于两个分支,List和Set是Collection的子接口,而Map则是与Collection同级别的.
2.HashSet的底层是HashMap,所以我们理解HashMap的扩容机制即可.
- 添加一个元素时,先得到hash值-会转成-->索引值
- 找到存储数据表table,到这个索引位置是否已经存放有元素,如果没有直接加入
- 如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后
- 如果一条链表的元素个数达到8,并且table的大小达到64,就会进行树化
3.List下面的集合类一般都是允许录入重复值的,而Set的集合类确是不允许出现重复值的
4.List和Set的实现集合都是单列集合,而Map的实现集合都是双列集合.
下表整理出了各个集合之间的特点:
Collection | Map | |||
无序 不唯一 | Collection | Map.value() | ||
有序 不唯一 | ArrayList | LinkedList | ||
无序 唯一 | HashSet | HashMap KeySet | ||
有序 唯一 | LinkedHashSet | TreeSet | LinkedHashMap KeySet | TreeMap KeySet |
存储结构 | 输出顺序 | 唯一性 | 查询效率 | 添加/删除效率 | |
ArrayList | 顺序表 | 有序(添加) | 不唯一 | 索引查询效率最高 | 效率低 |
LinkedList | 双向链表 | 有序(添加) | 不唯一 | 效率低 | 效率高 |
HashSet | Hash表 | 无序 | 唯一 | 效率最高 | 效率最高 |
HashMap | Hash表 | Key无序 | key唯一 | 效率最高 | 效率最高 |
LinkedHashSet | Hash表+链表 | 有序(添加) | 唯一 | 效率最高 | 效率最高 |
LinkedHashMap | Hash表+链表 | Key有序(添加) | key唯一 | 效率最高 | 效率最高 |
TreeSet | 红黑树 | 有序(自然) | 唯一 | 效率中等 | 效率中等 |
TreeMap | 红黑树 | 有序(自然) | key唯一 | 效率中等 | 效率中等 |