2019独角兽企业重金招聘Python工程师标准>>>

学Java的都知道hashMap的底层是“链表散列”的数据结构也也可以说是hash表。在put的实话先根据key的hashcode重新计算hash值的,而我们又知道hash是一种算法。所以哈希码并不是完全唯一的。

查看哈希码百科:

http://kaigejava.com/article/detail/168

哈希表可以说就是数组链表,底层还是数组但是这个数组每一项就是一个链表

一:为什么说hashmap的put方法是根据key进行hashcode计算的呢?

查看源码:

在查看hash方法,如下:

查看putVal方法:

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,

boolean evict) {

Node [] tab; Node p; int n, i;

if ((tab = table) == null || (n = tab.length) == 0)

n = (tab = resize()).length;

if ((p = tab[i = (n - 1) & hash]) == null)

tab[i] = newNode(hash, key, value, null);

else {

Node e; K k;

if (p.hash == hash &&

((k = p.key) == key || (key != null && key.equals(k))))

e = p;

else if (p instanceof TreeNode)

e = ((TreeNode )p).putTreeVal(this, tab, hash, key, value);

else {

for (int binCount = 0; ; ++binCount) {

if ((e = p.next) == null) {

p.next = newNode(hash, key, value, null);

if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st

treeifyBin(tab, hash);

break;

}

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;

}

}

if (e != null) { // existing mapping for key

V oldValue = e.value;

if (!onlyIfAbsent || oldValue == null)

e.value = value;

afterNodeAccess(e);

return oldValue;

}

}

++modCount;

if (++size > threshold)

resize();

afterNodeInsertion(evict);

return null;

}

二:hashmap怎么解决key的hash值冲突问题的?

上图是源码截图,说明:

1:初始化map的大小。默认是16

示例代码:HashMap map = new HashMap();

2:如果tab为空,就newNode一个放到链表中

示例代码:map.put("aa",1); 也就是图-1测试代码中的1

3:根据key算出的hash值如果存在,且key的值和map中已经存在的值equals了。所以就不处理。

如下图:

测试代码如图-1测试代码中的1和 2

4:如果p是TreeNode的子类进行putTreeValu

5:如果key的hash值和map中已经存在的key的hash相等且key不同的时候,如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

如图-1测试代码 1和4中key的hesh值都为3104

图-1测试代码

在来看下Node这个内部类:

三:在来看看怎么get方法

说明:

1:如果链表中第一个值的hash值和需要获取的key的hash值相等的话,就直接取出。

2:如果链表first.next !=null就循环查找链表中的key,知道查询到key.equals(k) 取出对应的值。

查看源码或许感觉不懂,那么画图来说明:

总结:

数据结构:哈希表可以说就是数组链表,底层还是数组但是这个数组每一项就是一个链表。

map的put方法:

1:new hashMap的时候初始化默认大小为16

2:当map.put("aa",1)的时候判断map没有值,就把aa算的hash值放到0X004的位置

3:当再次执行map.put("aa",1)的是计算aa的hash值为3104.此时在OX004的位置已经有数据了。进行判断存在的key和新put的key是否相同。相同不处理,值覆盖

4:执行map.put("aa",2)的时候key和已经存在的key相同就直接覆盖value了

5:执行map.put(3104,"cc")的时候,key的hash值也为3104.此时数组中OX004已经存在数据,判断key是否相同。发现3104和aa不相同【注:此时就发生了hash冲突】,那么就aa这个链表前面追加3104

6:执行map.put("bb","cc")。假设bb计算出的hash值是3105就存放在了OX005上。

其他依次类推

map的get方法:

当执行map.get("bb")的时候先计算出bb的hash值为3105在对应的位置(也就是0X005)取出第一个判断值是不是bb如果是就直接取出value.

当执行map.get("aa")的时候先计算出aa的hash值为3104,去对应的位置取出判断值(3104)不等于(aa)且还有next。就循环取出进行比较。

http://kaigejava.com/article/detail/168

转载于:https://my.oschina.net/kaigejava/blog/1862070

hashMap怎么解决hash冲突的相关推荐

  1. mysql映射成hashmap_大厂面试必问!HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  2. HashMap 如何解决 hash 冲突

    HashMap 底层采用数组的结构来存储数据元素,数组的默认长度是 16,通过 put 方法添加数据的时候,HashMap 根据 key 的 hash 值进行取模运算,最终保存到数组的指定位置 这种设 ...

  3. HashMap 怎样解决hash冲突?

    HashMap冲突解决方法比较考验一个开发者解决问题的能力. 下文给出HashMap冲突的解决方法以及原理分析,无论是在面试问答或者实际使用中,应该都会有所帮助. 在Java编程语言中,最基本的结构就 ...

  4. HashMap底层——解决Hash冲突(链地址法)

    1.链地址法 次日清晨,大臣们按时上朝,接着讨论昨日的话题. "昨日Hash函数的选择我们已经有了具体的方案了,那就只剩下冲突的解决问题了",王大臣率先发话. "要解决冲 ...

  5. HashMap解决hash冲突的方法

    HashMap解决hash冲突的方法 博客分类: jvm虚拟机 在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap ...

  6. 【Java面试小短文】HashMap是如何解决Hash冲突的?

    欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 文章目录 什么是Hash算法? 什么是Hash表? HashMap是如何解决Hash冲突的? 什么是Hash算法?   Hash 算法, ...

  7. Hashmap解决hash冲突为什么使用红黑树

    首先,在解决这个问题之前我们要先了解hash冲突是什么. hash冲突 hashmap在添加新的键值对的时候,会根据key值通过一个函数计算出一个结果作为地址值,根据这个地址值将其键值对插入到对应的位 ...

  8. HashMap解决Hash冲突为什么要使用红黑树

    1.HashMap的数据结构 HashMap是由数组与链表来实现的,同时,也具备了数组和链表的所以特点 2.什么是hash冲突 hash冲突:就是根据key即经过一个哈希变换得到的结果的作为地址去存放 ...

  9. java开放地址法和链地址法解决hash冲突

    hashMap对各位小伙们来说,没有不知道的了,使用过的人想必或多或少的都了解一点hashMap的底层实现原理,总结来说就是,数组+链表,至于源码的实现,大家可参看源码,今天想说的是hashMap是怎 ...

最新文章

  1. 更优雅地判断iOS设备类型
  2. pycharm如何查找程序项目中所有断点?
  3. 安卓系统挂载NTFS格式硬盘_Mac 读写 NTFS硬盘管理开源工具NTFSTool
  4. 俄国数学家称:“平行线可以相交”,却遭到质疑,死后12年被证实
  5. 计算机系统概论实验报告3,东南大学计算机网络第四次实验报告.docx
  6. Flex中动态更新List item
  7. 计算机监控网络运维合同书,网络服务托管运维合同范本
  8. rkmedia 中的行人检测
  9. spss20安装许可证代码_SPSS 22下载安装教程
  10. 阿里巴巴矢量图标库的使用
  11. vue实现留言板的功能_vue初探-简易留言板
  12. 我的“五一”特价机票是从爬虫手里买的
  13. linux sudo命令全称,你知道Linux系统中的sudo 命令吗?
  14. Ipad恢复按键音、锁定音和截屏音
  15. 北科计算机网络真题,北京科技大学计算机组成原理和数据结构历年试题及笔记...
  16. MYSQL优化汇总——学习入口
  17. DOS下Debug工具使用
  18. Revit模型在Web端展示的免费方案
  19. 下载北京社会保险个人权益记录
  20. iPhone 游戏 Dungeon Hunter2 地牢猎手 今日通关

热门文章

  1. git reset --hard HEAD
  2. 创建存储过程批量插入数据
  3. 深度学习之线性回归模型
  4. https ssl 总结
  5. 【Sphinx】MySQL+Sphinx 全文检索的使用和测试
  6. Ubuntu 16.04 GNOME在桌面左侧添加启动器(Launcher)
  7. UML建模工具EA和Rose比较
  8. 启用第三方Chrome插件
  9. 安装 node-sass 时报错
  10. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth