只有一个元素的Map为什么要new HashMap<String, Object>(1, 1.f)?

有时候我们需要一个只放一个元素的Map。
可能一开始是这样的

var map = new HashMap<String, Object>(1);

上面这种写法相当于

var map = new HashMap<String, Object>(1, 0.75f);

这样会导致什么呢?
我们知道 threshold = capacity * loadFactor
看HashMap中的resize方法的这段代码

        if (newThr == 0) {
            float ft = (float)newCap * loadFactor;
            newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
                      (int)ft : Integer.MAX_VALUE);
        }
        threshold = newThr;

所以上面这种写法,在putVal开始的时候会调用resize(),导致threshold ==0(1*0.75强转int),然后在putVal的结束的时候

if (++size > threshold)
            resize();

1 > 0 ,所以会再次调用resize(),这样Map的这个table长度就变成2了,但是Map此时是只有一个元素的

但是,用这种方式就没问题了

var map = new HashMap<String, Object>(1, 1.f);

当然,有时候可以用Collections.singletonMap(一个不可变的Map,只包含一个Key和一个Value)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容