栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HashMap的扩容因子可能打破你的认知

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HashMap的扩容因子可能打破你的认知

看过的HashMap的源码都知道 在我们声明容器的时候指定一个初始容量是一种比较合适的做法。
你设置的初始容量真的就是指定了容器的大小吗?
请看以下代码

public static void main(String[] args) {
		//设置一个初始化容量为10的map
        Map map = new HashMap<>(10);
        //放入1个元素
        map.put("1","2");
        //调用方法输出
        print(map);
}

public static void print(Map map) {
        try {
            Class mapType = map.getClass();
            Method capacity = mapType.getDeclaredMethod("capacity");
            capacity.setAccessible(true);
            System.out.println("capacity : " + capacity.invoke(map) + "    size : " + map.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

请看结果:

capacity : 16    size : 1

是因为设置初始化值得时候并不是按照指定的数值进行创建map 而是通过位运算后得到一个与我们设定值相近且大于的2的次方的值 大致上为 16,32,64,128,256等等
扩容机制真的是按照0.75来进行的?
请看以下代码

 public static void main(String[] args) {
        Map map = new HashMap<>(10);
        for (int i = 0; i < 100; i++) {
            map.put("1"+i,"2");
            print(map);
        }
    }

请看结果:输出太多 只贴出关键部分

capacity : 16    size : 10
capacity : 16    size : 11
capacity : 16    size : 12
capacity : 16    size : 13
capacity : 16    size : 14 //应该在12的时候进行扩容
capacity : 32    size : 15
capacity : 32    size : 16
capacity : 32    size : 17

为什么在插入第15个时候才进行扩容呢?
因此不仅仅和扩容因子有关,也和内存有关。如果key和value如果特别大那么就可能会引起提前扩容。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号