学习下hashMap中用到的关于hashCode性能优化技巧,作为笔记,为之后并发深入作基础。

1.关于提高性能的hash算法

在被模的位数为2的n次方时,用位与代替效率低下的模运算。位与效率相比模运算效率更高。
例:15%4=3,代替为 15 & 3=1111 & 0011=0011=3

hashmap中在求得某个key后,需要找到在哪个Entry数组下标的运算如下:

static int indexFor(int h, int length) {   
    return h & (length-1);   
}

例:
两个key,调用Object的hash方法后值分别为:
32,64,然后entry数组大小为:16,即在调用indexFor时参数分别为[32,15],[64,15],
这时分别对它们调用indexFor方法:
32计算过程:
  100000 & 1111 =>  000000 =>0
64计算过程如下:
 1000000 & 1111 =>  000000 =>0

可以看到indexFor在Entry数组大小不是很大时只会对低位进行与运算操作,高位值不参与运算(如果Entry大小为32,则只会与低5位进行与操作),很容易发生hash冲突。

这里,32与64这两个hash值,都被存储在Entry数组0的位置上。

为了解决这个问题,HashMap在做indexFor操作前,需要调用hash方法,使hash值的位值在高低位上尽量分布均匀,hash方法:
static int hash(int h) {  
    // This function ensures that hashCodes that differ only by  
    // constant multiples at each bit position have a bounded  
    // number of collisions (approximately 8 at default load factor).  
    h ^= (h >>> 20) ^ (h >>> 12);  
    return h ^ (h >>> 7) ^ (h >>> 4);  
}

还是按前面的key,经过Object的hash方法后,分别为32,64来进行运算:
32调用hash运算过程如下:
   原始h为32的二进制:
        100000
        h>>>20:  
        000000
    h>>>12:
        000000
    
接着运算 h^(h>>>20)^(h>>>12):
    结果:    100000

然后运算: h^(h>>>7)^(h>>>4),
过程如下:
    h>>>7:    000000
    h>>>4:    000010
最后运算: h^(h>>>7)^(h>>>4),
    结果:    100010,即十进制34
    
    调用indexFor方法:
        100010 & 1111 => 2,即存放在Entry数组下标2的位置上
------------------------------------

64的运算结果为:1000100,十进制值为68
    调用indexfor方法:
        1000100 & 1111 => 4,即存放在Entry数组下标4的位置上

可以看到经过hash方法后,再调用indexFor方法,这样可以减少冲突。

hashCode相关性能优化相关推荐

  1. Android应用性能优化系列逻辑篇——线程相关性能优化

    线程优化是Android性能优化中一个非常重要的部分,作为进程中逻辑处理调度的基本单位,如果使用不当,非常容易造成系统资源的浪费,从而导致应用性能出问题.在日常开发中,最常出现的问题主要有两个方面,一 ...

  2. Android性能优化面试题,与性能优化相关面试题 - 与IPC机制相关面试题 - 《Android面试宝典》 - 书栈网 · BookStack...

    源码分析相关面试题 Activity相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试题 与人事相关面试题现在三四月份,金三银四最好找工作时间, ...

  3. hashCode()方法的性能优化

    原文链接,译文链接,原文作者: Robert Nystrom,译者:有孚 本文主要讨论下不同的hashCode()的实现对应用程序的性能影响. hashCode()方法的一个主要作用就是使得对象能够成 ...

  4. IDEA JVM 性能优化 相关参数设置

    文章目录 IDEA JVM 性能优化 相关参数设置 IDEA JVM 性能优化 相关参数设置 点击 Help - Edit Custom VM Options -Xms256m -Xmx2048m - ...

  5. ios应用相关的性能优化及参考文档

    ios app programming guide: https://developer.apple.com/library/ios/documentation/iphone/conceptual/i ...

  6. Java命令 - 关于jvm性能优化与gc优化相关参数设置

    java 工具的介绍 java - 启动java程序 简介 Windows: javaw命令与java相同,除了javaw没有相关的控制台窗口.当您不希望出现命令提示符窗口时,请使用javaw.然而, ...

  7. Tomcat相关原理及性能优化

    文章目录 Tomcat相关原理部分 Tomcat的目录结构 Tomcat整体架构 http 服务器请求处理 Servlet容器工作流程 tomcat 整体架构 连接器-Coyote 容器-Catali ...

  8. MySQL相关参数配置及性能优化

    MySQL及其优化 文章目录 MySQL及其优化 数据库相关概念 事务的四大特性ACID 影响mysql数据库性能的几个方面 数据库性能优化的重点 CentOS系统参数优化 内核相关参数(/etc/s ...

  9. linux的相关优化技术,Linux性能优化及跟踪.md

    # Linux性能优化及跟踪 # 说明: * 图例.术语及内容很多来源于互联网,尤其是[Brendan Gredd' Blog](http://www.brendangregg.com/).[leez ...

最新文章

  1. gradle 构建过程
  2. Word2Vec学习笔记(二)
  3. 在生成.net core 3.0程序时不包含nuget库
  4. 学习webpack前的准备工作
  5. java多线程【线程常用方法】
  6. 华为畅享max有没有人脸识别_华为三款5000mAh超大电池手机,都是续航王者,最低只要1499元...
  7. SAP License:SAP S4HANA和ECC的区别
  8. java获取当前项目或类路径
  9. 关闭SqlConnection的方法
  10. oracle数据导出工具sqluldr2安装及使用
  11. 红包 mysql表设计_微信红包的设计实现
  12. 基于python3的百度街景地图爬虫
  13. 推荐10篇2021年服装设计相关毕业论文文献
  14. 失落的帝国攻略java,失落的帝国 --- 吴哥旅游日记(8)
  15. python小游戏:教你如何称霸朋友圈
  16. Self-attention GAN
  17. putty怎么上传下载文件和目录
  18. rtsp流php播放插件,nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器
  19. JS 浮点数转整数的方法
  20. 首届《Mr媛杯》程序媛选帅大赛开幕

热门文章

  1. 625这个数字很特别,625的平方等于390625。。。。。。
  2. 【批处理脚本】-3.3-exit命令详解
  3. 2017CS231n笔记_S13生成模型
  4. houdini volume 上色
  5. CSS设置溢出文字显示省略号
  6. 英语口语练习四十之地道口语:感谢及回应感谢的英语表达
  7. 如何在unity3d中制作灯光效果
  8. linux 下访问局域网,(在Linux系统下如何访问无线局域网.doc
  9. 江苏电信1元拿iPhone 6享百兆宽带
  10. ArcGIS中ArcMap快速自动计算单一波段或多波段栅格遥感影像NDVI的方法