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了么。。。这块应该怎么理解
展开
 我来答
anglewang98
2017-09-01 · TA获得超过535个赞
知道小有建树答主
回答量:420
采纳率:80%
帮助的人:284万
展开全部

这个问题可以跟踪一下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个了,可这时候如果每个数组只有一个节点,也要扩容吗?这有必要吗。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式