`
轻指飞扬
  • 浏览: 32742 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

解析HashMap的存储方式

    博客分类:
  • Java
阅读更多
Java集合中,HashMap的点名率很高,这归功于它的Key-Value键值对结构,还有它不错的效率。HashMap由于运用Hash算法定位并配合它的存储方式使它有了不错的效率,理解
它的存储方式对我们自己日常开发也有启发作用,就让我们一同来学一些吧~


首先看它的构造方法
HashMap()
          构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity)
          构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity, float loadFactor)
          构造一个带指定初始容量和加载因子的空 HashMap。

我们来看一下HashMap(int initialCapacity, float loadFactor)构造方法吧




在这个构造方法中可以看出,HashMap是用一个名为table的数组实现的,其数组元素是Entry,由于数组长度是固定的,而HashMap这种集合肯定是需要长度可变的,所以我们可以看到构造器中有capacity、loadFactor、threshold等几个变量的操作形成一套变换table数组长度的算法。
数组元素Entry到底是什么东西?是不是它使我们可以通过Key定位到Value呢?




Entry好像结构很简单,我们看到了key和value,键值对对应的功能就是出自于这两个家伙。等等我们还看到什么一个名为next的Entry<K,V>变量,这让我们联想起Entry是不是会作为链表元素出现呢?可他已经是数组元素了啊?
好吧,我们来看看HashMap的put方法




看到他的覆盖条件了吗?两个key的hash值一样还不够,还必须要equal的。读到这边我们就知道hash值相等的两个值可能并不equal。就是说多个不同的元素可能拥有同一hash值,就是说多个不同的元素会在同一个数组元素中。这时我们想到了前面的Entry的next变量。看到覆盖处理中for循环的迭代条件for (Entry<K,V> e = table[i]; e != null; e = e.next)与覆盖条件 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 我们就可以确认,它们确实是用链表实现的。
再让我们来看看它addEntry方法吧,它是怎么处理链表的




看到这里大家应该都知道了吧~
HashMap的存储方式用图片来展示一下


  • 大小: 20.1 KB
  • 大小: 25.5 KB
  • 大小: 25.7 KB
  • 大小: 17.3 KB
  • 大小: 33.3 KB
分享到:
评论

相关推荐

    jdom 解析xml存入hashmap的例子

    JDOM的核心类包括`SAXBuilder`用于解析XML文档,`Document`表示整个XML文档,`Element`代表XML的元素节点,`Attribute`表示元素的属性,而`HashMap`则用于存储解析后的数据。 1. **导入必要的库**: 在Java代码中...

    hashmap面试题_hashmap_

    HashMap是一个基于哈希表实现的键值对存储结构,它提供了快速的插入、删除和查找操作,平均时间复杂度为O(1)。HashMap非线程安全,适合于单线程环境或已经通过并发工具类控制并发的场景。 二、HashMap底层原理 ...

    Java HashMap高难度面试题集锦解析Java HashMap面试题及答案解析-高难度

    HashMap基于哈希表,使用键值对的存储方式。它维护了一个桶数组,通过键的哈希值决定其存储位置。在Java 8以前,当哈希冲突发生时,使用链表解决。从Java 8开始,当链表长度达到8时,链表会转为红黑树,以提高查找...

    hashmap中hash函数的构造问题

    在Java中,`HashMap`是一种非常常用的集合类,它提供了基于键值对的数据存储方式。`HashMap`内部使用哈希表来存储数据,其中最关键的部分就是哈希函数的设计。一个好的哈希函数能够将不同的键映射到不同的哈希值,...

    HashMap总结

    2. 配置文件解析:HashMap 可以用来解析配置文件,例如将配置文件的键值对存储在 HashMap 中。 3. 数据统计:HashMap 可以用来统计数据,例如统计用户行为、统计商品销售情况等。 HashMap 是一个非常有用的数据结构...

    Java源码解析HashMap的tableSizeFor函数

    HashMap的容量(Capacity)是存储元素的槽位数量,它必须是2的幂,如16、32、64等。这是因为HashMap使用了开放寻址法或链地址法来解决哈希冲突,确保每个槽位能够对应一个或多个键值对。当用户初始化HashMap时,可能...

    源码解析jdk8.0集合:HashMap的底层实现原理.pdf

    2. HashMap存储结构 JDK 7.0中的HashMap使用数组加链表的存储结构。数组中的每个元素对应一个链表,链表用于解决哈希冲突。但是当链表长度过大时,查找效率会降低,影响性能。为了解决这个问题,JDK 8.0对HashMap的...

    HASHMAP缓存.txt

    综上所述,《HASHMAP缓存.txt》文档不仅介绍了HashMap作为缓存的基本概念和实现方式,还涉及到了单例模式、线程安全、性能优化等高级主题,为开发者提供了丰富的技术细节和实用建议。在实际开发中,合理运用这些知识...

    hashmap 实例

    《HashMap 实例解析与关联数据结构对比》 HashMap 是 Java 中常用的一种数据结构,属于 Java.util 包下的类,它是基于哈希表实现的。在本文中,我们将深入理解 HashMap 的实例及其工作原理,并与其他数据结构如 ...

    源码解析jdk7.0集合(3):HashMap的底层实现原理.pdf

    ### JDK 7.0集合系列解析之...通过深入解析HashMap在JDK 7.0中的底层实现原理,可以更好地理解其运行机制和性能特性。掌握这些知识,可以帮助开发者合理使用HashMap,并针对不同的应用场景作出适当的调整和优化。

    Java源码解析HashMap成员变量

    `Node`是HashMap自定义的内部类,用来存储键值对。数组的默认长度是`DEFAULT_INITIAL_CAPACITY`,即16。`table`在HashMap中用于存储键值对,每个数组元素都是一个链表或红黑树的根节点。 在HashMap中,`loadFactor`...

    HashMap原理.rar

    本文将深入解析HashMap的工作原理、内部结构以及相关操作。 首先,哈希表是一种数据结构,它通过哈希函数将键(Key)映射到数组的索引位置,从而实现快速访问。HashMap在Java中是线程非同步的,适用于多线程环境下...

    HashMap资料.zip

    本资料将全面解析HashMap的工作原理、实现机制以及相关的面试知识点。 HashMap的核心特性是通过哈希算法快速定位元素,提供O(1)的平均时间复杂度进行插入、删除和查找操作。它不保证元素的顺序,特别是当元素数量...

    java 使用web service读取HashMap里的数值

    2. **HashMap**:Java集合框架的一部分,是一种键值对存储结构,提供了非常高效的查询和修改操作。 #### 实现步骤 ##### 第一步:创建WebService接口 为了更好地展示整个过程,我们首先需要创建一个简单的...

    java7-8中的 HashMap和ConcurrentHashMap全解析.pdf

    在Java 7和8中,HashMap和ConcurrentHashMap是两种重要的数据结构,分别用于非线程安全和线程安全的键值对存储。本篇文章将深入解析这两种数据结构的内部实现,帮助读者理解它们的工作原理。 HashMap是Java中最常用...

    详解HashMap源码解析(下).doc

    HashMap的源码解析涉及到的数据结构主要包括数组和链表,以及在负载过大时升级为红黑树的优化策略。理解这些机制对于高效使用HashMap和解决相关问题至关重要。此外,HashMap是非线程安全的,如果在多线程环境下使用...

    java7-8中的 HashMap和ConcurrentHashMap全解析

    在Java编程语言中,`HashMap`和`ConcurrentHashMap`是两种非常重要的数据结构,它们都属于`java.util`包,用于存储键值对。本文将深入解析这两个类在Java 7和8版本中的实现原理、特点以及使用场景。 首先,`HashMap...

    深入解析java HashMap实现原理

    Java中的HashMap是一个非常重要的数据结构,它实现了Map接口,提供了高效的数据存储和检索功能。HashMap的核心实现基于哈希表,其内部数据结构是数组与链表的结合,也就是所谓的“链表散列”结构。 1. **HashMap...

Global site tag (gtag.js) - Google Analytics