加强制度建设 信息公开 网站 专栏长春建站模板制作
加强制度建设 信息公开 网站 专栏,长春建站模板制作,湖北网站建设xiduyun,php7.1 WordPress文章目录 前言正文为什么要指定容量#xff1f; 前言
其实可以看到我写了这么久的博客#xff0c;很少去写hashMap的东西。 为什么#xff1f;因为这个东西感觉是java面试必备的#xff0c;我感觉大家都看到腻了#xff0c;所以一直没怎么去写hashMap相关的。
本篇内容 前言
其实可以看到我写了这么久的博客很少去写hashMap的东西。 为什么因为这个东西感觉是java面试必备的我感觉大家都看到腻了所以一直没怎么去写hashMap相关的。
本篇内容
举例说明 HashMap 使用的时候指定容量 错误用法源码走读HashMap初始容量的 计算方式源码走读扩容的点正确应该怎么去用一定要理解再用一些杂谈。 提示以下是本篇文章正文内容下面案例可供参考
正文
不开玩笑真的都知道指定容量但是有些用对了有些没用对。 为什么要指定容量
这个原由都不用说阿里的java开发手册就说的很明白 其实核心点就是避免数据量慢慢增加导致反复触发扩容影响性能。
于是乎就很多错误的使用方式了虽热影响不大
错误理解使用示例 ① 分页查询出来的数据需要转换成 Map 因为分页是固定了一页最多15条。
所以出现了这个代码
MapString, String map new HashMap(15);或者是
MapString, String map new HashMap(userPageList.size());错误理解使用示例 ② 类型type 有 4种 要放到一个map里面返回去。
所以出现了这个代码
MapInteger, String map new HashMap(4);错误理解使用示例 ③ 一个参数map里面想放2个参数。
所以出现了这个代码
MapString, String map new HashMap(2);不多举例其实这几个错误示例都是错在指定容量的 值上。
正例initialCapacity 需要存储的元素个数/负载因子 1
默认 指定是 传入 16 16* 0.7512 所以扩容阈值是12 。
说到这里大家应该知道为什么上面是错误用法了吧
比如我们想 存 4个元素到Map 我们为了避免后面触发扩容影响性能其实元素少性能没多少影响 就指定了 4
MapInteger, String map new HashMap(4);其实这样 4x0.75 3 那么如果存放第四个元素的时候就会触发扩容 这样就是违背了我们开始指定 的 4 的最初用意。
实战看看这个错误使用场景的情况
同过反射将capacity属性的权限拿到可以直接打印出来看下capacity的变化就知道是否触发了扩容
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {MapString, String map new HashMap(4);Class? mapType map.getClass();Method capacity mapType.getDeclaredMethod(capacity);capacity.setAccessible(true);map.put(1, 第一个元素插入);System.out.println(capacity : capacity.invoke(map) size : map.size());map.put(2, 第二个元素插入);System.out.println(capacity : capacity.invoke(map) size : map.size());map.put(3, 第三个元素插入);System.out.println(capacity : capacity.invoke(map) size : map.size());map.put(4, 第四个元素插入);System.out.println(capacity : capacity.invoke(map) size : map.size());}看下打印效果 为什么当size 3 也就是插入三个元素的时候还没变。
因为我们初始化容量值传入的 4 4* 0.75 3. 扩容阈值是 3 当插入第四个元素的时候 就超过了扩容阈值所以触发了扩容所以看的最后其实是进行了一次扩容打印出来的capacity是 8.
那么我们应该传多少
正例initialCapacity 需要存储的元素个数/负载因子 1
4/0.75 1 6.3333333
我们指定传6么还是传 7
指定6 指定7 指定67 都没区别好像 值得庆祝的是没有再次触发扩容。
那么为啥没区别呢 HashMap会转换成大于该capacity 的第一个2的幂作为容量 。 所以传5678 都是 8
传910111213141516 都是 16
好了不多啰嗦了 最后再补一嘴 默认指定容量其实就是 内存换性能。
所以真正去使用指定容量的时候 需要考虑如果我是一个定时任务允许跑1小时。。。我需要考虑性能么
或者如果我服务内存很小我是不是要对内存省吃俭用
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87668.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!