Map类图
待补充
HashMap
一个”拉链法”实现的散列表,利用Entry构成的数组,通过hash将Node<key,value>
键值对散列到数据中,Entry的子类可以是链表,也可以是树。如果链条太长就用红黑树结构去保证查询的效率。
-
几个重要的成员变量
- size是HashMap的大小,它是HashMap保存的键值对的数量。
- threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值=”容量*加载因子”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。
- loadFactor就是加载因子。 默认0.75,一个经验值
- modCount是用来实现fail-fast机制的。
支持key或value为null,key为null就存在table[0]的位置上
非线程安全
LinkedHashMap
HashMap的子类,只是给Entry附加了单向链表的特性,保存了数据插入顺序
TreeMap
红黑树实现,保证了有序,增删改查的复杂度都是log(n)。
红黑树可以简单理解为平衡二叉树,当然实际不是。
非线程安全,fast-fail实现
WeakHashMap
结构同HashMap,但有“弱键”特性,使用场景一般是缓存。
非线程安全
HashTable
HashMap的线程安全版,读写强一致性
key、value均不为null
ConcurrentHashMap
HashMap的线程安全版,写时强一致,读时弱一致
Java 7 引入Segment这一结构实现了分段锁
Java 8 Segment结构变化了,摒弃了分段锁,而利用UnSafe的CAS实现同步
IdentityHashMap
很少用