深入分析IntHashMap
来源:互联网 发布:java socket心跳检测 编辑:程序博客网 时间:2024/04/27 23:06
一、IntHashMap
1.1 准备
先从官网下载jar包:javasoft-collection.jar,解压后将jar包build到Java项目中.
1.2 IntHashMap类图
1.3 IntHashMap流程图
从上面类图可以看出IntHashMap和HashMap一样都是基于Map接口,在Map中最常用的2个方法是put()和get()方法。大家都知道Map是从键到值的映射,每个键不能出现重复且每个键最多只能映射到一个值。那么IntHashMap是如何保证键的唯一性?可能大家会想IntHashMap的键是int类型,使用==来比较,这样子虽然能保证键的唯一。但是随着元素的增加,每次都进行比较效率会越来越低。什么样的数据结构能快速的存储元素?答案是数组。在HashMap中是通过hash计算出bucketIndex位置找到数组中对应的元素,那么IntHashMap呢?IntHashMap亦如此,唯一不同的是计算bucketIndex的算法。通过indexFor()方法拿到bucketindex后。它会先去数组中找这个位置上的元素IntEntry<V>是否存在,如果存在的话,再通过key去查找value,然后将新值替换掉旧value。
代码清单2如下:
二、IntHashMap与HashMap比较
2.1 运行效率比较
创建一个测试类,分别往IntHashMap和HashMap各插入1万和5万条数据来测试它们性能、GC和内存使用
2.2 Visual GC比较
HashMap: IntHashMap:
2.3 结果分析
10000条数据测试结果:Map类型第一次取样第二次取样第三次取样GCIntHashMap795ms815ms807msNO GCHashMap866ms927ms861ms11.978ms50000条数据测试结果:Map类型第一次取样第二次取样第三次取样GC时间IntHashMap5166ms4817ms4997msNO GCHashMap4388ms4430ms3876ms40.453ms
从上面的测试结果可以看出,HashMap会随着容器大小的变化效率明显变慢。也许从数据测试结果来看使用IntHashMap在性能上比HashMap并没有太大优势甚至效率还要低些,但是从GC上来看明显IntHashMap更有优势。那么是什么让他们产生这样的差异?
2.4 差异一
HashMap在插入元素过程中会在堆中产生大量的Integer实例(如下图-Profiler界面),参考代码清单4。而IntHashMap不一样,它是以int作为key值类型(见代码清单5),能够减少Integer实例的产生,减少GC负担。
Profiler界面
代码清单4:
代码清单5:
2.5 差异二
在遍历时,IntHashMap(代码清单6)没有对hash进行比较。
代码清单6
作者:小毛驴,一个游戏人
梦想:世界和平
原文地址:http://blog.csdn.net/liulongling
- 深入分析IntHashMap
- 【Java基础提高】深入分析IntHashMap(三)
- 深入分析袭扰战术
- LookupDispatchAction, MappingDispatchAction深入分析
- ClassCastException深入分析
- vc多线程深入分析
- 深入分析DWREngine.endBatch
- 深入分析DWREngine._sendData
- 深入分析DWREngine._stateChange
- asp.net深入分析
- 深入分析qsort库函数
- Overlapped模型深入分析
- 深入分析异常机制!
- 深入分析异常机制!
- LookupDispatchAction, MappingDispatchAction深入分析
- 全文检索 深入分析
- IOCP的深入分析
- IOCP的深入分析
- 遍历Map的四种方式
- 算法题-大数相乘问题
- js追加元素
- 浅谈安卓系统内存运行机制
- 洛谷3390 矩阵快速幂
- 深入分析IntHashMap
- cf刷水题一周记录
- logstash-input-jdbc实现mysql 与elasticsearch实时同步
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
- oracle常用函数总结
- CSS3 动画属性
- 坑之 Jpa 执行原生SQL 返回映射为对象
- 动画系列之属性动画
- vue---vue中如何操作dom获取节点?.vue组件中通过mounted获取节点操作