调试JDK源码-一步一步看HashMap怎么Hash和扩容

调试JDK源码-ConcurrentHashMap实现原理

调试JDK源码-HashSet实现原理

调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因

Hashtable是线程安全的,我们从源码来分析

代码很简单

Hashtable<String, String> ht = new Hashtable<String, String>();ht.put("111", "http://blog.csdn.net/unix21/");ht.put("222", "www.csdn.net");ht.put("333", <a target=_blank href="http://www.java.com">www.java.com</a>);

注释写的很好,生成一个新的,空的hashtable,使用默认的capacity容量为11,factor增长因子为0.75

这一步开始初始化

下一步就完成了实例化

Entry是一个静态嵌套类

    /*** Hashtable bucket collision list entry*/private static class Entry<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Entry<K,V> next;protected Entry(int hash, K key, V value, Entry<K,V> next) {this.hash = hash;this.key =  key;this.value = value;this.next = next;}@SuppressWarnings("unchecked")protected Object clone() {return new Entry<>(hash, key, value,(next==null ? null : (Entry<K,V>) next.clone()));}// Map.Entry Opspublic K getKey() {return key;}public V getValue() {return value;}public V setValue(V value) {if (value == null)throw new NullPointerException();V oldValue = this.value;this.value = value;return oldValue;}public boolean equals(Object o) {if (!(o instanceof Map.Entry))return false;Map.Entry<?,?> e = (Map.Entry<?,?>)o;return (key==null ? e.getKey()==null : key.equals(e.getKey())) &&(value==null ? e.getValue()==null : value.equals(e.getValue()));}public int hashCode() {return hash ^ Objects.hashCode(value);}public String toString() {return key.toString()+"="+value.toString();}}

其实就是因为这个put方法是synchronized的所以可以保证其线程安全
 

算出hash码,然后算出在默认长度11下的index索引是4

默认entry为空直接跳到addEntry(hash, key, value, index)

addEntry方法体内,一开始modCount=0

下一步由于count =0  >  threshold=8

生成一个新的Entry

新的节点挂在tab[4]上,然后count++。

回到put函数,至此一个完整的put就完成了。

第二次put,生成的index是7

哈希冲突

注意这段代码,其实就是判断是否出现hash冲突了

Entry<K,V> entry = (Entry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}}

知道了hashtable默认的长度是11,那么我们就可以制造一个会产生哈希冲突的数据集就可以了

Hashtable<String, String> ht = new Hashtable<String, String>();for (int i = 0; i < 20; i++) {ht.put((char) (i + 65) + (char) (i + 66) + (char) (i + 67) + "", i + ">>>http://blog.csdn.net/unix21/");}

经过几次put之后,终于产生了一次哈希冲突,这次的索引是10,而tab[10]已经有值。

产生冲突有2个原因一个是因为相同的key必然会产生相同的索引。还有一种就是不同的值产生哈希冲突了。

所以这里先判断是不是相同的key导致的。

进入addEntry方法

之前的冲突节点一并传入,被挂在新节点后面也就是其next下

回到addEntry,可以看到新的节点以及挂在tab[10].next下了。

调试JDK源码-Hashtable实现原理以及线程安全的原因相关推荐

  1. 调试JDK源码-ConcurrentHashMap实现原理

    调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...

  2. 调试JDK源码-HashSet实现原理

    调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...

  3. 调试JDK源码-一步一步看HashMap怎么Hash和扩容

    调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hash ...

  4. 跟踪调试JDK源码时遇到的问题及解决方法

    目录 问题描述 解决思路 在IntelliJ IDEA中调试JDK源码 在eclipse中调试JDK源码 总结 问题描述 最近在研究MyBatis的缓存机制,需要回顾一下HashMap的实现原理.于是 ...

  5. 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值

    最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u9 ...

  6. 通过CLion 调试JDK源码

    通过CLion 调试JDK源码 0. 简述 0.1 使用环境: 宿主机操作系统:Windows 10 专业版 虚拟机软件:VMware® Workstation 16 Pro 虚拟机操作系统:[ubu ...

  7. JDK源码重新编译——支持eclipse调试JDK源码--转载

    最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar. 下面这六步是编译jdk的具体步骤: Step 1:   ...

  8. Eclipse中关联并调试JDK源码

    eclipse关联JDK源码的一般步骤: 1.依次选择Window -> Preferences: 2.依次选择Java -> Installed JREs -> Jre- -> ...

  9. 解决Eclipse调试JDK源码无法查看变量值

    问题 研究JDK源码的同学应该知道,在debug的时候是无法看源码中变量的值的,为什么呢?因为在JDK中,sun对rt.jar中的类编译时,去除了调试信息.那么是否有解决办法呢?答案是肯定的. 解决方 ...

最新文章

  1. mysql 5.6.14 64位_如何在64位WIN7下安装64位的解压版MySQLmysql-5.6.14
  2. 自学python需要买书吗-学习python需要有编程基础吗
  3. 区块链即数字生产关系
  4. 【看图识算法】这是你见过最简单的 “算法说明书”
  5. 【Linux】一步一步学Linux——groupdel命令(88)
  6. Micropython教程之TPYBoard制作蓝牙+红外循迹小车
  7. 最大功率点跟踪测试软件,最大功率点跟踪
  8. 如何去掉jQWidgets中TreeGrid和Grid右下角的链接
  9. 【数据结构与算法】字符串匹配 BM算法
  10. DataMan-美团旅行数据质量监管平台实践
  11. 计算机网络资料篇(一)——HTTP
  12. .net 遍历界面上所有的控件,替换危险字符,例如单引号。
  13. MvcPager 免费开源分页控件3.0版发布!
  14. [导入]Nebula3学习笔记(5): IO系统
  15. Java分代垃圾回收机制:年轻代/年老代/持久代(转)
  16. 拓端tecdat|R语言中ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型用于预测时间序列数据
  17. python 类(1)
  18. 支付宝企业转账到个人账户
  19. SpringCloudGateway原理——Gateway集成eureka服务发现转发请求
  20. 生活哪些方面作用计算机,电脑在我们的生活中起着重要的作用

热门文章

  1. 深度学习--TensorFlow (1)单层感知器1 -- 实现单数据训练
  2. OpenCV(十八)霍夫变换(直线、线段与圆检测)
  3. 【机器视觉案例】(13) 脸部和摄像机间的距离测量,自适应文本大小,附python完整代码
  4. 【TensorFlow2.0】(5) 数学计算、合并、分割
  5. uniapp 分享缩略图过大怎么办_女性胸外扩怎么办|3步带你完成改变
  6. 1803无法升级到2004_Win10再度误伤“友军”:升级五月更新后OneDrive同步报错
  7. NETGEAR拒绝连接请求_3分钟理解HTTP的请求与响应
  8. ats 5.3.2中的header-rewrite插件调研
  9. PBR游戏3D模型合集包 PBR Game 3D-Models Bundle February 2022
  10. linux系统目录树/内核源码目录树