Java中HashMap初始容量问题
看到书上说hashmap底层的数组大小是2的幂,那假设我现在初始化Map<String,Integer>map=newHashMap<>(13);我想问现在map的桶到底...
看到书上说hashmap底层的数组大小是2的幂,那假设我现在初始化
Map<String, Integer> map = new HashMap<>(13);
我想问现在map的桶到底有多少个呢。。。如果是13个那说是2的幂又怎么理解
第二个问题
文档说在hashmap中链表长度大于8的时候要转化成红黑树,可源码写的是
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
TREEIFY_THRESHOLD -1 不是7了么。。。这块应该怎么理解 展开
Map<String, Integer> map = new HashMap<>(13);
我想问现在map的桶到底有多少个呢。。。如果是13个那说是2的幂又怎么理解
第二个问题
文档说在hashmap中链表长度大于8的时候要转化成红黑树,可源码写的是
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
treeifyBin(tab, hash);
TREEIFY_THRESHOLD -1 不是7了么。。。这块应该怎么理解 展开
1个回答
展开全部
这个问题可以跟踪一下HashMap的源码就知道了,根据输入的初始化容量(门槛?)的值(先了解HashMap中容量和负载因子的概念,其实这个和HashMap确定存储地址的算法有关),先判断是否大于最大容量,最大容量2的30次方,1<<30 =(1073741824),如果大于此数,初始化容量赋值为1<<30,如果小于此数,调用tableSizeFor方法 使用位运算将初始化容量修改为2的次方数,都是向大的方向运算,比如输入13,小于2的4次方,那面计算出来桶的初始容量就是16.
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
/**
* Constructs an empty <tt>HashMap</tt> with the specified initial
* capacity and load factor.
*
* @param initialCapacity the initial capacity
* @param 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)
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);
}
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
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;
}
追问
恩恩 之后自己又看了看源码 追了一下程序,明白了这个。
大神 我想再问两个问题,
第一个问题是在扩容的时候书上说当前数组的元素个数大于等于阈值就扩容,这里这个只是指数组吗?假设现在
capacity = 16,loadFactor=0.75,数据中不为null值的有12个了,可这时候如果每个数组只有一个节点,也要扩容吗?这有必要吗。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询