本文涉及的源码基于 JDK 1.8.0_101 。
1. HashTable
- 采用数组 + 链表(表头插入)方式解决哈希冲突。
- 所有的 public 方法都用
synchronized
修饰以保证线程安全。 - 在构造时就初始化槽数组(默认大小为
11
)。 - 键、值 都不能为
null
。 - 指定 key 的目标槽的定位逻辑:
(key.hashCode() & 0x7FFFFFFF) % table.length
,掩码+求模。 - 槽数组的最大尺寸为 MAX_ARRAY_SIZE:
Integer.MAX_VALUE - 8
(减 8 是因为一些 JVM 会在数组里保留一些 header words)。 - 扩容逻辑为 两倍 + 1。
- 阈值为:
(int)(capacity * loadFactor)
,但不能超过MAX_ARRAY_SIZE + 1
。