java map的正确姿势,你还再new HashMap么?

java map的正确姿势,你还再new HashMap么?

先看示例

反例

	Map<String, Object> paramMap = new HashMap<>(2);
	paramMap.put("deviceId", "324sefdsfds2342ersdfsdf");
	paramMap.put("number","13800138000");
	Map resultMap = httpClientUtil.doPost(braceletIPPort + "/iot/bracelet/", paramMap);

正例,使用guava初始化

 <!--guava类库依赖 -->
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>18.0</version>
    </dependency>
	import com.google.common.collect.Maps;
	#使用google guava工具初始化
	Map<String, Object> paramMap = Maps.newHashMapWithExpectedSize(2);
	paramMap.put("deviceId", "324sefdsfds2342ersdfsdf");
	paramMap.put("number","13800138000");
	Map resultMap = httpClientUtil.doPost(braceletIPPort + "/iot/bracelet/", paramMap);

为什么呢?

HashMap 初始化指定capacity后,当增加后并不是到指定capacity后,才扩容。
本例中指定HashMap的capacity =2,当paramMap.put(“number”,“13800138000”)时候执行了扩容,带来cpu损耗。
guava初始的capacity 直接初始化足够的空间,避免了,增长后的扩容带来的损耗。

总结:

使用hashmap不是不行,只是最好根据扩容机制自己计算一下capacity 参数。而guava自动帮你计算好了,直接使用即可。
小的项目怎么写都无所谓了,但是tps高的应用,效果好使很明显的。

测试用例

用于Map 并没有直接获取capacity 的方法,所以采用java反射获取capacity

public class MapLean {
    public static void main(String[] args) {

        Map map = new HashMap<>(2);
        Map map2 = Maps.newHashMapWithExpectedSize(2);

        MapLean.getCapactiy(map, "map1初始化size=");
        MapLean.getCapactiy2(map2, "map2初始化size=");
        for (int i = 1; i <= 2; i++) {
            map.put(i, "" + i);
            MapLean.getCapactiy(map, "map1循环第" + i + "次:");
            map2.put(i, "" + i);
            MapLean.getCapactiy2(map2, "map2循环第" + i + "次:");
        }
    }

    @SneakyThrows
    private static Object getCapactiy(Map map, String message) {
        Class<?> mapType = map.getClass();
        Method capacity = mapType.getDeclaredMethod("capacity");
        capacity.setAccessible(true);
        Object capacityObject = capacity.invoke(map);
        System.out.println(message + capacityObject);
        return capacityObject;
    }

    @SneakyThrows
    private static Object getCapactiy2(Map map, String message) {
        Class<?> mapType = map.getClass();
        Method capacity = mapType.getDeclaredMethod("capacity");
        capacity.setAccessible(true);
        Object capacityObject = capacity.invoke(map);
        System.out.println(message + capacityObject);
        return capacityObject;
    }
}
执行结果:
map1初始化size=2
map2初始化size=4
map1循环第1次:2
map2循环第1次:4
map1循环第2次:4
map2循环第2次:4
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆天-逍遥哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值