背景:hashmap面试基础必考内容,需要深入了解,并学习其中的相关原理。此处还要明白1.7和1.8不通版本的优化点。

Java 8系列之重新认识HashMap

Java 8系列之重新认识HashMap

鉴于JDK1.8做了多方面的优化,总体性能优于JDK1.7,下面我们从两个方面用例子证明这一点(在hash均匀和不均匀的情况下性能都有明显的提升)

不管增加、删除、查找键值对,定位到哈希桶数组的位置都是很关键的第一步。前面说过HashMap的数据结构是数组和链表的结合,所以我们当然希望这个HashMap里面的元素位置尽量分布均匀些,尽量使得每个位置上的元素数量只有一个,那么当我们用hash算法求得这个位置的时候,马上就可以知道对应位置的元素就是我们要的,不用遍历链表,大大优化了查询的效率。HashMap定位数组索引位置,直接决定了hash方法的离散性能。先看看源码的实现(方法一+方法二):

方法一:
static final int hash(Object key) { //jdk1.8 & jdk1.7
int h;
// h = key.hashCode() 为第一步 取hashCode值
// h ^ (h >>> 16) 为第二步 高位参与运算
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
方法二:
static int indexFor(int h, int length) { //jdk1.7的源码,jdk1.8没有这个方法,但是实现原理一样的
return h & (length-1); //第三步 取模运算
}

这里的Hash算法本质上就是三步:取key的hashCode值、高位运算、取模运算。

对于任意给定的对象,只要它的hashCode()返回值相同,那么程序调用方法一所计算得到的Hash码值总是相同的。我们首先想到的就是把hash值对数组长度取模运算,这样一来,元素的分布相对来说是比较均匀的。但是,模运算的消耗还是比较大的,在HashMap中是这样做的:调用方法二来计算该对象应该保存在table数组的哪个索引处。

这个方法非常巧妙,它通过h & (table.length -1)来得到该对象的保存位,而HashMap底层数组的长度总是2的n次方,这是HashMap在速度上的优化。当length总是2的n次方时,h& (length-1)运算等价于对length取模,也就是h%length,但是&比%具有更高的效率。

在JDK1.8的实现中,优化了高位运算的算法,通过hashCode()的高16位异或低16位实现的:(h = k.hashCode()) ^ (h >>> 16),主要是从速度、功效、质量来考虑的,这么做可以在数组table的length比较小的时候,也能保证考虑到高低Bit都参与到Hash的计算中,同时不会有太大的开销。

Java源码分析:HashMap 1.8 相对于1.7 到底更新了什么?

Java源码分析:HashMap 1.8 相对于1.7 到底更新了什么?

ps超详细的 太牛逼了 好好读读

1.8不会出现1.7的多线程环形链死循环情况,但是还不是线程安全的,因为没有同步锁。

jdk1.8与1.7之间 hashmap的不同,优化点!!

所有处理的根本目的,都是为了提高 存储key-value的数组下标位置 的随机性 & 分布均匀性,尽量避免出现hash值冲突。即:对于不同key,存储的数组下标位置要尽可能不一样

JDK 1.8 的优化目的主要是:减少 Hash冲突 & 提高哈希表的存、取效率

最新文章

  1. SqlServer 常用函数
  2. c++怎样让函数返回数组
  3. 编程之美读书笔记之 -寻找出现次数为1的ID的问题
  4. 【Networking】Thrift and gRPC
  5. Python学习笔记-Day3-set集合操作
  6. 济南学习 Day 4 T2 am
  7. Quality in the Test Automation Review Process and Design Review Template
  8. Java并发框架——AQS堵塞队列管理(一)——自旋锁
  9. [转]eclipse借助hibernate tool从数据库逆向生成Hibernate实体类
  10. error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”
  11. 王者齐聚!Unite 2017 Shanghai 日程讲师全揭晓
  12. python的str()和repr()的区别
  13. 时分秒计时器 js
  14. Linux 安装 powershell
  15. CodeForces 1151C Problem for Nazar
  16. Spring 使用介绍(九)—— 零配置(二)
  17. [iOS] 测试设备解决自签名证书问题
  18. mysql5.6特殊字符问题
  19. matlab知识点汇集
  20. Microsoft Dynamics CRM4.0 和 Microsoft Dynamics CRM 2011 JScript 方法对比

热门文章

  1. Yii集成PHPWord
  2. LeetCode 935. Knight Dialer
  3. LeetCode 931. Minimum Falling Path Sum
  4. http服务读取配置文件,交叉编译
  5. Windows 2008R2 定时备份PostgreSQL 11.6及还原操作
  6. CSPS_113
  7. CSP2019自闭记
  8. mysql lower()函数
  9. Alpha冲刺(5/6)
  10. beforeDestroy的使用