IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> JDK_1.8中对hash算法和寻址算法是如何优化的? -> 正文阅读

[数据结构与算法]JDK_1.8中对hash算法和寻址算法是如何优化的?

首先咱们先来了解一下如何使用key值的hashCode去寻址:

获取key值的hashCode
利用hashCode%数组长度得到index下标
这就是一个寻址的过程,但是取模是一个非常消耗性能的操作,并且如果张三和李四取模后得到下标标一致就会出现hash冲突,解决hash冲突又是是一个耗时的操作,所以JDK做了以下几个步骤来优化;

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

这段代码是HashMap中在获取hashCode之后进行优化的方法,int是4个字节也就是32位,代码中看到key值的hashCode赋值给h,然后将h和h右移16位的结果进行了异或运算,什么意思呢,假设h原先的值为1111 1111 1111 1111 1011 1011 1111 0011(这是二进制的值,不懂的好好复习一下数据结构),右移16位之后呢得到了0000 0000 0000 0000 1111 1111 1111 1111,然后将两者进行亦或运算得到了1111 1111 1111 1111 0100 0100 0000 1100,这个得到的二进制结果他的第16位是不是同时包含了原先key值的hashCode的高16位和低16位的特征,先记住这一点为什么要这么做;

接下来我们说取模是一个非常耗时的操作,所以JDK选择了另外一种方式,也就是将异或得到的hashCode和数组长度进行&的操作,经过前人的努力,得到了一个公式,hashCode&(array.length-1)=hashCode%数组长度(这里有一个要求就是数组长度得是2的n次方),一般来说数组的长度初始是16,所以array.length-1也就是0000 0000 0000 0000 0000 0000 0000 1111(后称A),拿A和未经过处理的h去进行&运算是不是高16位根本都没有参与,因为A的高16位全部是0,&运算是其中一方为0结果就是0,所以如果只有h的低16位参与了运算是不是就加大了A&h结果相同的概率,所以JDK要将h右移16位在进行亦或运算,把高16位的特征也加入到低16位中去,这样A&h的结果相同的概率就小了,也就会减少处理hash冲突所带来的性能损耗;

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:33:23  更:2021-11-29 16:36:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:26:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码