热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HashMap和HashTable源代码分析

哈希表是一种能够进行快速查找且能够支持高效插入的数据结构,JAVA已经有多个不同的类实现了哈希表,在日常应用中,我们经常会使用哈希表存储一些数据,通过get和push方法实现数据的

哈希表是一种能够进行快速查找且能够支持高效插入的数据结构,JAVA已经有多个不同的类实现了哈希表,在日常应用中,我们经常会使用哈希表存储一些数据,通过get和push方法实现数据的获取和存储。

先简单看看一些简单的区别

  • 大小限制
    HashTable和HashMap都有默认的初始化大小,hashTable的默认大小是 11*0.75,hashMap的默认大小是16

《HashMap和HashTable源代码分析》 QQ截图20170215200405.png

  • HashTable 继承与Distionary类,使用Entry的数组存储数据,HashMap继承AbstractMap类,使用Entry数组存储数据,可以看到的是,两者的基础bean都是一样的,都包含hash、key、value、next,从数据结构来看,这里应该用到的就是拉链法,拉链法后面会进行详细介绍,简单来说,就是在冲突的时候,通过链表来处理冲突。

《HashMap和HashTable源代码分析》 2.png

  • HashTable操作entry数组的时候会使用JAVA的同步关键字,防止多线程的时候,entry数组溢出,而HashMap则无使用,HashTable是线程安全的,而HashMap不是

《HashMap和HashTable源代码分析》 Paste_Image.png

JDK1.7使用了拉链法

《HashMap和HashTable源代码分析》 Paste_Image.png
《HashMap和HashTable源代码分析》 Paste_Image.png

  • 简单来说,拉链法就是数组里面的每一个元素都会作为一个链表的头结点,当通过put方法将数据放进哈希表时,哈希算法计算到的数组位置如果是相同的元素,会组建成链表,从而解决冲突。
  • 拉链法优化性能,都是通过扩大容量来减少冲突,为什么呢?因为每一条链表的长度都会缩短,通过哈希算法计算出数组位置一样的可能性降低了。

void transfer(Entry[] newTable) {
Entry[] src = table; //src引用了旧的Entry数组
int newCapacity = newTable.length;
for (int j = 0; j Entry e = src[j]; //取得旧Entry数组的每个元素
if (e != null) {
src[j] = null;//释放旧Entry数组的对象引用(for循环后,旧的Entry数组不再引用任何对象)
do {
Entry next = e.next;
int i = indexFor(e.hash, newCapacity); //!!重新计算每个元素在数组中的位置
e.next = newTable[i]; //标记[1]
newTable[i] = e; //将元素放在数组上
e = next; //访问下一个Entry链上的元素(访问链表的下一个元素,链表头结点就是newTable[i])
} while (e != null);
}
}
}

HashTable是如何解决线程安全的?

HashTable类的实例,对于不同线程的临界区是entry数组,不同线程之间对该数组进行插入、更新、删除操作可能会造成线程安全问题。由于entry数组里面有很多个元素,如果想对entry数组加synchronized关键字显然不可能,因为你不知道,每一个线程到底什么时候才会对哪个元素进行操作。HashTable使用了最简单的办法,那就是将数组作为一个整体,对于访问该数组的方法,基本上都加了synchronized关键字,。但由于这样锁的粒度会比较大,性能也就没有concurrentHashMap快了。


推荐阅读
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 如何使用计算机控制遥控车的步骤和电路制作方法
    本文介绍了使用计算机控制遥控车的步骤和电路制作方法。首先,需要检查发送器的连接器和跳线,以确定命令的传递方式。然后,通过连接跳线和地面,将发送器与电池的负极连接,以实现遥控车的前进。接下来,制作一个简单的电路,使用Arduino命令将连接到跳线的电线接地,从而实现将Arduino命令转化为发送器命令。最后,通过焊接晶体管和电阻,完成电路制作。详细的步骤和材料使用方法将在正文中介绍。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
Z张海男_851
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有