`

HashMap 数据结构

    博客分类:
  • java
阅读更多

  hashMap用了一个名字为table的数组;还有若干个名字为entry的链表。看hashMap是如何应用这些数据结构的。用插入<key,value>举例:hashMap首先会通过key得到其hashCode,具体的hash函数就不说了(因为没多大意义);然后把key的hashCode%table.length,就是拿hashCode模table数组大小,得到的余数就是key所在table数组中的下标(实际不是key的下标,是entry类);但这样做有个问题,可能不同key却有一样的hasdCode,所以求余后其必然会得到相同的下标,那如何存储了?有两个办法,一种是利用开放地址法,就是说后来相同的hashCode去找先来hashCode所在下标的相邻下标。说的有点绕口,举个例子,比如<1,2>已经存在table数组的31的位置上了,再来一个<101,102>,其通过哈希后说:我也应该在31的位置上,但是table说,你后来,你再在31附近找个空位安置下吧。当然,具体怎么找,有规则的。另外一种方式就是链地址法,还是拿以上的例子说,<101,102>来到时,发现31的位置已经被占了,这时table说:<1,2>,你带下<101,102>;其实就是要<1,2>把<101,102>的引用存储了。但是<1,2>说:我怎么存储<101,102>的引用了,我没位置呀。所以table说:我给你们每个壳(entry类)吧,把你们都封装了;于是就有了 entry类。

    那hashMap是使用那种方式了。先分析下开放地址和链地址法的优缺点。开放地址法一般需要2倍实际数据大小的空间,因为要留下一定的空闲地址去存储相同hashCode的<key,value>;并且查找相邻空闲地址也是一项比较费时间的任务;链地址法,就不需要2倍的空间(table数组),但是需要存储额外的信息,比如next信息;总体来看,链地址法好点(关键是节省了查找相邻地址的时间),所以,hashMap用的是链地址法。



还有问题,hashMap为什么用数组存储index(hashCode%table.length)了,而不用链表了?

因为数组有固定大小限制,而链表没有,而且map是没有限制大小的?这主要考虑了查找效率的问题。从前面的分析可以看到,因为key的hashCode%table.length直接做为entry的下标,所以其查询key的速度很快,只要O(1)的时间;如果是链表,要一个一个的排查对比,需要O(N)的时间;这之间的效率,相差太远了。所以,hashMap用了数组。



最后一个问题,那数组的固定大小如何解决了?

hashMap在每次插入数据前,会检查table数组的实际容量,如果实际容量>=初始容量,则把 table的初始容量扩为原来的2倍,这时,就需要一个一个复制原来的数据项了,这是比较费时的!所以,初始容量很重要。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    比较分析Vector、ArrayList和hashtable hashmap数据结构

    javaScript模拟的HashMap数据结构的对象

    javaScript模拟的HashMap数据结构,可以方便的put和get。几乎和Java中HashMap类的功能一模一样。非常好用的!

    HashMap的数据结构

    HashMap是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,主要用于存储键值对(Key-Value)数据。HashMap在内部实现上基于哈希表,也称为散列表,它提供了一种快速查找、插入和删除数据的方法,...

    HashMap的一个数据结构

    HashMap的一个数据结构 锁升级:锁升级过程 resize的过程在开发中 怎么保证容器它线程安全后就是数据插入过程使用的头插法 但是头插法会造成一些问题等等等等的那个等等的那个等等的那个等等的那个等等的那个等等的...

    dcl.rar_Delphi DCL_dcl数据_delphi hashmap_hashmap.pas

    本篇文章将详细探讨标题中的“dcl.rar_Delphi DCL_dcl数据_delphi hashmap_hashmap.pas”,特别是其在Delphi中对HashMap数据结构的实现。 首先,让我们来了解下什么是DCL(Data Control Library)。DCL是Delphi中的...

    剖析Java中HashMap数据结构的源码及其性能优化

    在Java编程语言中,HashMap是实现键值对存储的关键数据结构之一。它是基于哈希表原理,通过将键(Key)映射到哈希值,快速定位到存储的值(Value)。本文将深入剖析Java中HashMap的数据结构以及性能优化策略,特别是...

    基于JavaScript的HashMap实现

    这篇博客“基于JavaScript的HashMap实现”可能详细阐述了如何通过自定义函数来创建一个高效且灵活的HashMap数据结构。 在JavaScript中,对象(Object)是哈希表的一种表现形式,其内部通过键(key)来定位值(value...

    js 版 java hashmap

    在描述中提到的"js版java HashMap"可能是指一个JavaScript实现的HashMap类,它模仿了Java中的HashMap数据结构,提供了更高效和灵活的操作。Java的HashMap是一个基于哈希表的Map接口实现,提供快速的插入、删除和查找...

    kpcb-hashmap:自定义Java HashMap数据结构

    Java中的HashMap是编程中最常用的集合...如果你深入研究这个项目的源码,不仅可以学习到高级的Java编程技巧,还能了解如何针对具体应用场景优化数据结构,这对于提升编程技能和理解数据结构的底层工作原理非常有帮助。

    今天的赛事的比分如下.docx

    该技术使用Java语言中的HashMap数据结构来统计单词的出现次数,并使用Scanner类来获取用户输入的英文句子。 首先,在strTostrArray方法中,将输入的英文句子转换为小写,并使用正则表达式将非字母字符替换为空格...

    jdk1.8中文文学习手册

    hashMap数据结构的优化 原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode 方法,计算出哈希码值,经过哈希算法算成数组的...

    Java HashMap的三种遍历方法及优缺点含示例

    ### HashMap数据结构简介 在深入遍历方法之前,我们先回顾一下HashMap的基本数据结构。HashMap由数组和链表(在JDK1.8之后还包括红黑树)组成,数组是其主体结构,而链表和红黑树则用于处理哈希冲突。当两个键的...

    jdk1.8.zip

    hashMap数据结构的优化 原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode 方法,计算出哈希码值,经过哈希算法算成数组的...

    01-HashMap底层数据结构分析.mp4

    01-HashMap底层数据结构分析.mp4

    关于如何解决HashMap线程安全问题的介绍

    在Java编程中,HashMap是一个非常常用的集合类,用于存储键值对数据。然而,它存在一个重要的特性,那就是线程不...在设计和编写多线程程序时,要始终关注数据结构的选择和操作的同步控制,以保证程序的正确性和效率。

    jdk-8u202-linux-x64.tar

    hashMap数据结构的优化,原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode方法,计算出哈希码值,经过哈希算法算成数组的...

    jdk-8u112-windows-x64.zip

    hashMap数据结构的优化 原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode 方法,计算出哈希码值,经过哈希算法算成数组...

    jdk1.8.0_60_linux.zip

    hashMap数据结构的优化 原来的hashMap采用的数据结构是哈希表(数组+链表),hashMap默认大小是16,一个0-15索引的数组,如何往里面存储元素,首先调用元素的hashcode 方法,计算出哈希码值,经过哈希算法算成数组的...

    Hashmap详解

    HashMap 是一种常用的数据结构,在 Java 中,它是一个数组和链表的结合体。下面我们将深入探讨 HashMap 的数据结构、 put 方法的实现细节和 Hash 码的计算过程。 HashMap 的数据结构 HashMap 的数据结构可以分为两...

Global site tag (gtag.js) - Google Analytics