详解HashMap集合(13)
关于这个值的设置 , 在《阿里巴巴Java开发手册》有以下建议:
也就是说 , 如果我们设置的默认值是7 , 经过Jdk处理之后 , 会被设置成8 , 但是 , 这个HashMap在元素个数达到 8*0.75 = 6的时候就会进行一次扩容 , 这明显是我们不希望见到的 。 我们应该尽量减少扩容 。 原因也已经分析过 。
如果我们通过initialCapacity/ 0.75F + 1.0F计算 , 7/0.75 + 1 = 10 ,10经过Jdk处理之后 , 会被设置成16 , 这就大大的减少了扩容的几率 。
当HashMap内部维护的哈希表的容量达到75%时(默认情况下) , 会触发rehash , 而rehash的过程是比较耗费时间的 。 所以初始化容量要设置成initialCapacity/0.75 + 1的话 , 可以有效的减少冲突也可以减小误差 。
所以 , 我可以认为 , 当我们明确知道HashMap中元素的个数的时候 , 把默认容量设置成initialCapacity/ 0.75F + 1.0F是一个在性能上相对好的选择 , 但是 , 同时也会牺牲些内存 。
我们想要在代码中创建一个HashMap的时候 , 如果我们已知这个Map中即将存放的元素个数 , 给HashMap设置初始容量可以在一定程度上提升效率 。
但是 , JDK并不会直接拿用户传进来的数字当做默认容量 , 而是会进行一番运算 , 最终得到一个2的幂 。 原因也已经分析过 。
但是 , 为了最大程度的避免扩容带来的性能消耗 , 我们建议可以把默认容量的数字设置成initialCapacity/ 0.75F + 1.0F 。
推荐阅读
- 极速鲨课堂85:显卡怎么测试 3DMARK详解
- 性能翻倍!飞腾首款8核桌面处理器腾锐D2000详解
- 详解工程师不可不会的LRU缓存淘汰算法
- 网速再翻倍,官方详解小米 11 搭载的 WiFi 6 增强版技术
- leetcode之错误的集合
- 苹果指南详解如果隐私受到威胁,如何锁定iPhone
- 小米多看电纸书Pro详解:1099元值不值得买?
- 电动汽车「换电问题」详解:更换电池是否为新电池呢?
- 安卓面试必备的JVM虚拟机制详解,看完之后简历上多一个技能
- 新能源出租车驶入包头,运管部门详解换新热点问题