如何保证HashMap不重建Hash表

如何保证HashMap不重建Hash表

在《阿里巴巴java开发规约》里面,有推荐在初始化HashMap的时候指定初始化长度,尤其是已经知道结果的key数量的时候
在这里插入图片描述
元素个数 >= initialCapacity * loaderFactor 的时候,HashMap就会自行进行扩容到 大于当前容量的下一个 2 的幂,重建 Hash表会影响性能,那么如何保证Hash表不被重建呢? 先看一段代码。

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class HashMapTest {
    public static void main(String[] args) throws Exception {
    	//假设我们知道返回结果的元素个数为 100,即可这样写代码
        int num = 10;
        // HashMap 的负载因子默认为 0.75
        float loadFactor = 0.75f;
        Map<String, Object> map = new HashMap<String,Object>((int)(num/0.75f),loadFactor);
        //使用反射机制查看 capacity 属性
        Class<?> mapType = map.getClass();
        Method capacity = mapType.getDeclaredMethod("capacity");
        capacity.setAccessible(true);
        int times = num;
        for (int i=0;i< times;i++){
            map.put(""+i,i);
            System.out.println("capacity "+i+":"+capacity.invoke(map));
        }
    }
}

输出结果

capacity 0:16
capacity 1:16
capacity 2:16
capacity 3:16
capacity 4:16
capacity 5:16
capacity 6:16
capacity 7:16
capacity 8:16
capacity 9:16

可见,capacity一直都没变,因此最重要的是初始化时将初始容量设为(int)(num/loadFactor) 即可保证Hash表不被重建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值