程序员开发经验随笔码农的世界

九成的人会答错的HashMap阈值问题

2019-06-28  本文已影响27人  山东大葱哥

问题

JDK1.7中一个HashMap中是否会出现size>threshold情况?

背景知识

了解HashMap的同学都知道,HashMap中有几个重要的字段:

HashMap扩容的条件

关于扩容条件很多资料说的都是在size超过阈值时,就会触发扩容,以减少冲突的发生。
但我在这里告诉大家,这个说法是错误的或者是不准确的。我们直接看jdk1.7中HashMap的源代码:

    void addEntry(int hash, K key, V value, int bucketIndex) {
        //判断已经存在的Entry数量是否超过了实际可容纳量、当前节点是否发生hash碰撞。
        if ((size >= threshold) && (null != table[bucketIndex])) {
            //如果超过阈值并且即将发生hash碰撞,则进行resize
            resize(2 * table.length);
            //重新计算hash
            hash = (null != key) ? hash(key) : 0;
            //重新计算索引位置
            bucketIndex = indexFor(hash, table.length);
        }
        //创建Entry节点对象
        createEntry(hash, key, value, bucketIndex);
    }

看到其中的if条件是,与,两个条件都满足才进行resize:

所以如果只是size超过了阈值,而当前节点不发生碰撞的话,还是可以继续在原数组中存储数据的,因此就会出现下图的情况:


image.png

size=14 超过了 threshold=12 的阈值。

上一篇下一篇

猜你喜欢

热点阅读