本文参照https://www.cnblogs.com/chengxiao/p/6059914.html#commentform作者的文章,并分享一些自己的体会。

本文将主要回答以下两个问题:

1. 为什么table的容量必须是2的N次方?

2. 在重写equals方法时,为什么要重写hashcode方法?

3. 为什么hash冲突的时候,将新插入的元素至于链表头?


1. 为什么table的容量必须是2的N次方?

  • length为2的整数次幂的话,h&(length-1)就相当于对length取模,这样便保证了散列的均匀,同时也提升了效率;
  • length为2的整数次幂的话,这样length-1的bit位都为1,这样便保证了h&(length-1)的每一位可能为0,也可能为1(这取决于h的值),即与后的结果可能为偶数,也可能为奇数,这样便可以保证散列的均匀性,而如果length不是2的N次方的话,很明显length-1必然存在某一个bit位是0的情形,length不是2的N次方的情况包括两种:1.length为偶数,例如length=6,则length-1=5(101),存在0bit位;2.length为奇数,例如length=7,kength-1=6(110),同样存在bit位是0的情况。这样h&(length-1)肯定存在bit位为0的情形(包括最后的bit位是0),即只能为偶数,这样任何hash值都只会被散列到数组的偶数下标位置上,这便浪费了近一半的空间,因此,length取2的整数次幂,是为了使不同hash值发生碰撞的概率较小,这样就能使元素在哈希表中均匀地散列。
  • key---->hashcode------>hash----->index,整体上这是一个多对一的映射,而key----->hash这个过程也是一个多对一的映射,因此hash---->index必须为一对一的映射,而只有在bit位都为1时才符合这种情况,这应该是其原因之一.

如上图所示,只有在length-1全为1时,h---->index的映射才符合一对一。PS:本图引用于https://www.cnblogs.com/chengxiao/p/6059914.html#commentform

2. 在重写equals方法时,为什么要重写hashcode方法?

java的帮助文档要求,如果equal方法重写,那么hashcode也必须重写。其实际的目的在于,如果a.equals(b),那么必须保证其hashcode值相等。

即keyA和keyb相等,经过hashcode映射后的值也必须相等。


3. 为什么hash冲突的时候,将新插入的元素至于链表头?

例如要插入的元素为A,链表中之前存有B和C两个元素,我们很容易定位到table[i],只需要使得A=table[i];A->next = B;即可,否则的话需要先遍历链表,然后在末尾进行插入,这样增加了遍历的开销。


开通博客第一天,good luck!

浅析HashMap的实现原理的更多相关文章

  1. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  2. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  3. HashMap的工作原理深入再深入

    前言 首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类): equals:是否同一个对象实例.注意,是 ...

  4. [转] HashMap的工作原理

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...

  5. 【转】HashMap的工作原理

    很好的文章,推荐Java的一个好网站:ImportNew HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hasht ...

  6. 转:HashMap的工作原理,及笔记

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...

  7. HashMap的工作原理(转)

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...

  8. java 关于 hashmap 的实现原理的测试

    网上关于HashMap的工作原理的文章多了去了,所以我也不打算再重复别人的文章.我就是有点好奇,我怎么样能更好的理解他的原理,或者说使用他的特性呢?最好的开发就是测试~ 虽说不详讲hashmap的工作 ...

  9. HashMap的存储原理

    HashMap是java中相当重要的数据结构,使用HashMap的场景非常之多,因此,了解HashMap实现的过程和原理,是非常有必要的,在一些面试中也会经常被问到.好了,我们赶紧来研究java内部是 ...

随机推荐

  1. windows中cmd常用命令收集

    1.经常会启动端口后忘关,需要杀端口的命令:查找端口占用命令 netstat -ano|findstr 端口例如      (8081)      杀端口: taskkill /pid xxxxx - ...

  2. Nilearn 小记

    4.绘制脑图像 4.1 绘图功能 当打开了太多图像而不关闭时,会出现如下问题: 每次调用绘图函数都会创建一个新图像.当在非交互式设置(例如脚本或程序)中使用时,这些图像不会显示,但会常驻于内存中并最终 ...

  3. sql server把一个库表的某个字段更新到另一张表的相同字段

    缘由:进行update时忘了加where条件,导致所有数据全部update.. sql: 1 update Activity set endTime=b.endTime from idj_tl_bf. ...

  4. tomcat中显示本地图片①(已解决)

    解决方案 我直接放源码了. 原理就是:我虽然调用的是虚拟目录,但是会映射到对应路径的实际 第一步:(在tomcat的 server.xml中创建一个虚拟目录) 虚拟目录创建方式: <Contex ...

  5. Economics degrees

    Economics degrees Name game"> 经济学学位"> 名称痕戏 Luring students with a new label 新瓶旧酒吸引学生 ...

  6. Kotlin 泛型

    泛型,即 "参数化类型",将类型参数化,可以用在类,接口,方法上. 与 Java 一样,Kotlin 也提供泛型,为类型安全提供保证,消除类型强转的烦恼. 声明一个泛型类: cla ...

  7. 怎么样启用红米手机5的ROOT权限

    红米手机5能如何拥有了root超级权限?各位清楚,android机器有root超级权限,一旦手机拥有了root相关权限,就能够实现更强的功能,举个栗子各位公司的营销部门的妹纸,使用较多营销工具都需要在 ...

  8. hive中控制文件生产个数

    在有些时候,想要控制hql执行的mapper,reducer个数,reducer设置过少,会导致每个reducer要处理的数据过多,这样可能会导致OOM异常,如果reducer设置过多,则会导致产生很 ...

  9. vue项目中使用插件将字符串装化为格式化的json数据(可伸缩)

    插件地址:https://www.npmjs.com/package/vue-json-viewer 第一步:安装vue-json-viewer插件 $ npm install vue-json-vi ...

  10. 『计算机视觉』Generalized Intersection over Union: A Metric and A Loss for Bounding BoxRegression

    论文地址:Generalized Intersection over Union 一.相关工作 目标检测精度标准 度量检测优劣基本基于 IOU,mAP 是典型的基于 IOU 的标准,但是 mAP 仅有 ...