map
是常用的数据类型,我经常用的是HashMap
,好处是简单效率也还不错。本篇同时会涉及到TreeMap
与ConcurrentHashMap
,作为有序和线程安全的map
的常用实现,这两种类型也是比较常用的。
HashMap
以数组实现的哈希桶数组,用 Key 的哈希值取模桶数组的大小可得到数组下标。
HashMap
不是线程安全的类,在扩容时可能产生死循环报错。
成员
// hash表,会在第一次使用的时候初始化,必要的时候会进行扩容。容量总是2的次方
transient Node<K,V>[] table;
// 对于entrySet()方法的一个缓存,实际并不会存储任何数据,只是对`map`数据做操作
transient Set<Map.Entry<K,V>> entrySet;
// 表示存储了多少key-value mappings
transient int size;
// 用来fail-fast
transient int modCount;
// 扩充阀值 等于capacity * loadFactor
int threshold;
// 加载因子
final float loadFactor;