Java容器系列-HashMap源码分析
HashMap 实现了 Map 接口。HashMap 使用的很广泛,但不是线程安全的,如果在多线程中使用,必须需要额外提供同步机制(多线程情况下推荐使用 ConCurrentHashMap)。 HashMap 的类图相对简单,主要就是继承了 AbstractMap,有一点需要注意,虽然没有实现 Iterable 接口,但 HashMap 本身还是实现了迭代器的功能。 本文基于 JDK1.8 成员变量及常量 HashMap 是一个 Node[] 数组,每一个下标称之为一个 桶 。 每一个键值对都是使用 Node 来存储,这是一个单链表的数据结构。每个桶上可以通过链表来存储多个键值对。 常量 HashMap 中用到的常量及其意义如下: // 初始容量(桶的个数) 2^4 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量(桶的个数) 2^30static final int MAXIMUM_CAPACITY = 1 << 30;// 默认的装载因子(load factor),除非特殊原因,否则不建议修改static final float DEFAULT_LOAD_FACTOR = 0.75f;// 单个桶上的元素个数大于这个值从链表转成树(树化操作)static final int TREEIFY_THRESHOLD