解决hash冲突的几种方法_hashmap hash冲突

解决hash冲突的几种方法_hashmap hash冲突哈希表定义散列表(Hashtable,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。实现关键点hash函数hash冲突解决首先来说hash函数,java中对象都已一个hashCode()方法,那为什么还

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

哈希表定义


  • 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。 也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。 这个映射函数称做散列函数,存放记录的数组称做散列表。

实现关键点


  • hash函数
  • hash冲突解决

hash函数
首先来说hash函数,java中对象都已一个hashCode()
方法,那为什么还需要hash函数呢?hashCode是在jdk中是有符号int类型,这个一个很大的范围,如果散列表的数组能覆盖所有int值的话,就不需要hash函数了,当然内存不允许我们维护这么大的散列表。这时我们需要hash函数将原始hashCode映射到一个很小的数组上去。
常见的做法是取模法,也是jdk中的实现方式。

  • HashMap实现

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
 static int indexFor(int h, int length) {
         return h & (length-1);
     }

第一个hash函数有人称之为“扰动函数”,第二个indexFor函数在jdk8中去掉了,函数内的代码合并到了putVal中,个人认为这两个函数合并起来是一个完整的hash函数。
h & (length-1) 这段代码的作用其实就是取模,假设数组初始化长度为16,那么length-1的结果为15,对应二进制为00001111,如果我们有一个大小为20的key,对应二进制为00010100,与运算后结果为00000100,对应十进制为4.
这里数组的长度必须为2的次幂。

由于对key进行了取模运算,所以我们知道当length=16的时候,我们会舍弃调掉key高位的值,只保留了低4位。本来int是32位,只是用低4位冲突是不是太容易发生了?
所以第一个“扰动函数”的作用出现了,这个函数将key本身高16和低16位做了异或运算。
解决hash冲突的几种方法_hashmap hash冲突

从网上找了这张图,可以解释下(h = key.hashCode()) ^ (h >>> 16) 的作用。

通过高位和低位异或之后,本来被丢弃的高位值在做取模运算的时候也能体现得到。


  • ThreadLocal.ThreadLocalMap实现

 private void set(ThreadLocal<?> key, Object value) {

            // We don't use a fast path as with get() because it is at
            // least as common to use set() to create new entries as
            // it is to replace existing ones, in which case, a fast
            // path would fail more often than not.

            Entry[] tab = table;
            int len = tab.length;
            int i = key.threadLocalHashCode & (len-1);

            for (Entry e = tab[i];
                 e != null;
                 e = tab[i = nextIndex(i, len)]) {
                ThreadLocal<?> k = e.get();

                if (k == key) {
                    e.value = value;
                    return;
                }

                if (k == null) {
                    replaceStaleEntry(key, value, i);
                    return;
                }
            }

            tab[i] = new Entry(key, value);
            int sz = ++size;
            if (!cleanSomeSlots(i, sz) && sz >= threshold)
                rehash();
        }

其中int i = key.threadLocalHashCode & (len-1); 就是直接取模。


hash冲突避免

  • HashMap
    • 拉链法
  • ThreadLocal.ThreadLocalMap
    • 线性探测再散列
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179087.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python 逐行读取txt 文件并生成列表

    前言开始1.载入文件2.读取数据流3.数据处理4.关闭文件前言我们在编写一些自动化脚本的时候,为了方便,经常需要以txt文件作为数据输入,今天就跟大家讨论一下如何对txt文件进行读取并生成对应的列表等程序可操作的数据载体。开始1.载入文件这步就大家比较熟悉,文件操作中最基本的了。因为我们只需要读取文件,并不需要写入文件,所以在这里指定mode=”r”为只读模式(默认)。f=open(“C:/foo.txt”,”r”,encoding=’utf-8′)此时就有了这.

    2022年4月8日
    1.5K
  • MATLAB 绘制折线图

    MATLAB 绘制折线图MATLAB绘制折线图想要绘制出如上图所示折线图,首先,先展示代码:x=0:10:50;a=[0,1.80,7.60,17.40,31.20,49.00]plot(x,a,’s-g’,’MarkerSize’,2,’MarkerFaceColor’,’g’,’MarkerEdgeColor’,’g’,’LineWidth’,2);gridb=[0,1.10,4.20,9.30,1…

    2022年6月14日
    49
  • pandas at loc_pandas str

    pandas at loc_pandas strpandas中.loc和.iloc以及.at和.iat的区别显示索引和隐式索引显示索引和隐式索引importpandasaspddf=pd.DataFrame({‘姓名’:[‘张三’,‘李四’,‘王五’],‘成绩’:[85,59,76]})#传入冒号‘:’,表示所有行或者列#显示索引:loc,第一个参数为index切片,第二个为columnsdf.loc[2] #index为…

    2022年8月30日
    1
  • Dubbo框架介绍「建议收藏」

    Dubbo是一个常用的分布式服务框架,它致力于提供高性能和透明化的RPC远程调用服务方案,Dubbo有助于开发企业级的开发效率,以及可以通过简单的配置就可以做到负载均衡。   一、Dubbo的基础知识   1.Dubbo是什么   2.Dubbo涉及的知识      二、Dubbo框架设计介绍   1.Dubbo的各个角色

    2022年4月13日
    30
  • 需求分析报告应该包含哪些部分_2020最新抖音用户画像分析报告:粉丝都有哪些特点和需求?…[通俗易懂]

    需求分析报告应该包含哪些部分_2020最新抖音用户画像分析报告:粉丝都有哪些特点和需求?…[通俗易懂]本文相关:抖音用户画像分析、抖音用户画像报告、2020最新抖音用户画像分析等不管是做抖音运营还是抖音直播,了解粉丝,了解用户的需求是非常重要的!做任何事情,对症下药你才能事半功倍!比如你的粉丝想要梨子,你却给他了一个苹果,你的粉丝大部分都是分布在三线开外的城市,你却总给他们推荐昂贵的鸡肋产品!这就是没有提前了解抖音用户画像的结果!接下来,我就给你分析一下最新的抖音用户画像报告!让你运营起…

    2022年4月30日
    43
  • mysql 创建数据库 utf8 命令_mysql创建数据库 utf8

    mysql 创建数据库 utf8 命令_mysql创建数据库 utf8CentOS6.5下通过Shell创建、备份、还原MySQL数据库CentOS6.5下通过Shell创建、备份、还原MySQL数据库创建数据库:mysql-uroot-p123456-e”CREATEDATABASEIFNOTEXISTSyourDatabaseNameDEFAULTCHARSETutf8COLLATEutf8_g…文章微wx笑2014-12-083…

    2022年10月25日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号