脚本宝典收集整理的这篇文章主要介绍了4.24-HashMap构造方法源码学习,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
Constructs an empty HashMap with the specified initial capacity and load factor. Params: initialCapacity – the initial capacity //初始化容量 loadFactor – the load factor //负载因子 Throws: IllegalArgumentException – if the initial capacity is negative or the load factor is nonpositive
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0) //说明初始化容量不能小于0
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY) //初始化容量不能大于MAXIMUM_CAPACITY,就是1 << 30, 为啥不是 1<<31呢?因为int的容量为 -2^31-2^31-1
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor)) //说明负载因子必须>0,如果小于0是不行的
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor; //负载因子
this.threshold = tableSizeFor(initialCapacity); //临界值,就是传说中的initialCapcity*loadFactor
}
static final int tableSizeFor(int cap) { //初始化容量,可以为0的
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
/*
Implements Map.putAll and Map constructor.
Params:
m – the map //传入的map
evict – false when initially constructing this map, else true (relayed to method afterNodeInsertion).
*/
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
int s = m.size();
if (s > 0) {
if (table == null) { // pre-size
float ft = ((float)s / loadFactor) + 1.0F;
int t = ((ft < (float)MAXIMUM_CAPACITY) ?
(int)ft : MAXIMUM_CAPACITY);
if (t > threshold)
threshold = tableSizeFor(t);
}
else if (s > threshold)
resize();
for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
K key = e.getKey();
V value = e.getValue();
putVal(hash(key), key, value, false, evict); //这一步数组才真正的初始化
}
}
}
以上是脚本宝典为你收集整理的4.24-HashMap构造方法源码学习全部内容,希望文章能够帮你解决4.24-HashMap构造方法源码学习所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。