![5249b486246fcafbc9d562df7e38df5d.png](https://i-blog.csdnimg.cn/blog_migrate/d309667d6026ac7a57e5c573d9bd1516.png)
HashMap 就四个操作:
- 初始化
- 写
- 读
- 算size
初始化这个部分干脆看 1.8 版本的更好的实现,因为 1.7 版本的内容完全就是这部分子集,核心逻辑完全一致,
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
基本上没干什么。
如果把最后一个从别的 Map 里初始化这种情况去掉,就是在不停地玩弄 loadFactor 和 threshold 这两个参数而已。
唯一有点意思的就是它其实允许随意设置容量,不过最后还是用 tableSizeFor 函数要你给的数变成一个 2 的幂。
注意!初始化 HashMap 不会初始化里面的table,只是写参数而已。