`

HashMap的存取解析

 
阅读更多

   今天想了解点别的了,HashMap的存取解析。大家都知道HashMap是键值对存在的,key-value的形式。但,内部是怎么存储的?我们一起来看看吧

  标注:基于的jdk版本为1.6.0_45

  First,大家都知道Map的entrySet方法返回的是Set<Entry>,所以就好奇Entry到底是个什么东西?

    Entry是接口,是Map接口中的一个内部接口,Map提供的接口就不给大家介绍了,Entry提供的接口方法有:

      K getKey() //获取Entry的key值

      V getValue() //获取Entry的value值

      setValue(V value) //替换value值

      equals(Object o)//你懂的

      hashCode() //你也懂的

 其实这些方法大家也不陌生  微笑

    Second,HashMap.Entry实现Map.Entry接口?

       看代码,我们发现HashMap.Entry是一个Link结构,并且key和value为其属性,并使用next指向下一个Entry。

        关于方法的实现就不介绍了,HashMap额外提供了两个空方法,一个是recordAccess,一个是recordRemoval,在HashMap的介绍中,不多做介绍,在后面的LinkedHashMap再详细说明

 

   Third,HashMap怎么利用Entry存放key-Value呢?并且,HashMap是怎么遍历的呢?是对Entry的Link遍历?有了这一连串的疑问之后,继续探索吧!

       HashMap使用Entry数组,如下图1:

 上图中transient修饰符是啥意思呢?

    是一个临时非序列化的变量,不可以被序列化存放起来。生命周期仅存于内存中。

 Third_First:存放

     HashMap提供的put方法执行操作,请注意putForNullKey和put的方法类似,只是putForNullKey定好了table的存放位置:

     1.获取key的hash。其中的hash方法只是为了保证它有唯一的值,并且null的hash一定是0.

     2.在图1中的table中找到key对应的位置使用的方式 hash & length,确定index

     3.在table[i]存放的Entry对象中继续遍历,看其中是否存在hash、key是否完全一样的,如果是则直接替换

      4.如果步骤3找不到完全匹配的,则直接在table[i]对应的地方最后一个链表节点增加该元素

  

 

    addEntry的处理:1.取到index的Entry;2.重新给一个新的链接,链接的是最新放入的,完全符合队列link;3.长度超过设定扩展至两倍

   

 Third_Second:遍历

  其中用内部类HashIterator处理的,设定一个next Entry和current Entry。next为下一个点,current是当前点。咱们使用的Iterator.next接口具体实现方法为HashIterator的nextEntry。nextEntry方法中1.是对Entry链进行遍历,如果到这个链的队尾,则从table中取得下一个Entry链。2.将之前查找到的Entry返回给前台。源码如下:

 

 一位姓丁的NB同事曾经排查过一个高并发的情况下:HashMap如果EntryA的next指向EntryB,而EntryB的next指向EntryA,会导致get死循环。

 

  • 大小: 4.4 KB
  • 大小: 17.5 KB
  • 大小: 5.7 KB
  • 大小: 16.3 KB
  • 大小: 31.3 KB
分享到:
评论
1 楼 chenliangzg 2016-04-12  
  受益匪浅!

相关推荐

    android Pull XML文件解析 存取 代码程序

    本篇文章将深入探讨如何在Android中使用Pull解析器进行XML文件的解析和存取。 一、XML解析器简介 在Android中,有两种主要的XML解析方式:SAX(Simple API for XML)和DOM(Document Object Model)。SAX是事件驱动...

    HashMap-hash原理

    为了实现高效的数据存取操作,`HashMap`内部采用了数组加链表(JDK 1.8以前)或数组加链表/红黑树(JDK 1.8及以后版本)的数据结构。本文将重点解析`HashMap`中hash算法的核心原理及其优化细节。 #### 二、计算Key...

    48-Java知识点 手写HashMap1

    在Java编程中,HashMap是一种常用的集合类,它提供了一种快速存取键值对的方式。HashMap基于哈希表的原理实现,其内部结构是数组加链表,JDK1.8之后如果链表长度超过8则会转换为红黑树,以优化查找性能。本文将深入...

    Java 实例 - HashMap遍历源代码-详细教程.zip

    HashMap是一个基于哈希表实现的键值对数据结构,提供了快速的存取速度,平均时间复杂度为O(1)。它允许null键和null值,并且不是线程安全的,适用于多线程环境下的并发容器如ConcurrentHashMap。 2. **HashMap内部...

    java提高篇(二三)-----HashMap.pdf

    HashMap以键值对(key-value)的形式存储数据,通过哈希算法高效地定位存储位置,允许快速存取。以下是对HashMap的深入解析: 1. **HashMap的定义与特性** - HashMap是一个基于哈希表的实现,提供了键映射到值的...

    Java 中的HashMap详解和使用示例_动力节点Java学院整理

    HashMap是Java中高效、灵活的键值对存储工具,其内部机制通过哈希表实现了快速存取。理解和掌握HashMap的工作原理对于优化程序性能至关重要。在实际应用中,应根据数据规模和并发需求选择合适的构造函数参数,以达到...

    cpp-sparsemap一个高效hashmap和hashset的C实现

    《C++ Sparse Map:高效的哈希映射与集合实现解析》 在计算机科学中,数据结构的选择对于程序的性能有着至关重要的影响。特别是在C++这样的系统级编程语言中,高效的数据结构更是程序员们的得力助手。本文将深入...

    Java中HashSet的解读_.docx

    在深入解析HashSet之前,我们需要了解其内部使用的HashMap的工作原理。 HashMap是Java中的一个关键数据结构,它通过哈希函数将键(Key)映射到数组的特定位置,实现快速存取。HashSet利用HashMap的这一特性,以键值...

    java面试宝典

    203、编程用JAVA解析XML的方式. 49 204、EJB2.0有哪些内容?分别用在什么场合? EJB2.0和EJB1.1的区别? 51 205、EJB与JAVA BEAN的区别? 51 206、EJB的基本架构 51 207、MVC的各个部分都有那些技术来实现?如何实现? 52...

    2021-2022计算机二级等级考试试题及答案No.4031.docx

    - **解析**:数据库物理设计是在逻辑结构基础上选择适合特定应用环境的物理结构的过程,包括确定数据在物理设备上的存储结构(如索引、分区等)和存取方法。这一步骤对于优化数据库性能至关重要。 - **正确答案**...

    30重点面试题-Fu1

    实体类如HashMap实现了Map接口,提供键值对的快速存取,TreeMap则按照键的自然顺序或自定义比较器排序。 6. 创建线程的方式: - 继承Thread类:创建新的Thread子类,重写run()方法,然后通过new Thread实例并调用...

    js代码-罗马数字转整数(首先建立一个HashMap来映射符号和值,然后对字符串从左到右来,如果当前字符代表的值不小于其右边,就加上该值;否则就减去该值。以此类推到最左边的数,最终得到的结果即是答案)

    以下是这个问题的详细解析。 1. **哈希映射(HashMap)**: 哈希映射是一种数据结构,它能够快速地根据键(key)查找和存取值(value)。在这个问题中,我们可以创建一个对象,将罗马数字字符(如"I", "V", "X"等...

    java 经典面试笔试题

    3. **存取权限** - **知识点**: Java中提供了四种访问级别:`public`、`protected`、`default`(缺省,也称为包访问)、`private`。这些访问级别决定了一个类、方法或属性的可见范围。 - **解析**: | | 子类 | 包...

    2021-2022计算机二级等级考试试题及答案No.3899.docx

    不同之处在于`TreeMap`内部使用红黑树排序,支持按照键的自然顺序或自定义比较器排序,而`HashMap`则提供更快的存取速度,但不保证顺序。 ### 知识点16:数组元素的引用 - **内容概述**:在一维数组中,只能引用...

    java写爬虫代码

    `HashMap`提供了键值对的快速存取,而`ArrayList`是动态数组,方便进行元素的添加、删除和查找。 4. **线程安全**: 虽然这个示例没有提到多线程爬虫,但注意到`SearchCrawler`实现了`Runnable`接口,这意味着它...

    2021-2022计算机二级等级考试试题及答案No.10346.docx

    - **解析**: 如果对象要保存在`HashSet`或`HashMap`中,它们的`equals`方法相等,则它们的哈希码值也必须相等。这是因为`HashSet`和`HashMap`通过哈希码来快速定位对象。如果不相等,会导致对象无法正确存储或检索...

    JIT-Java高级程序设计试卷A.doc

    在选项C中,`java.util.HashMap`是一个哈希表,可以快速存取元素,且支持键的唯一性。 3. **泛型(Generics)**: 泛型允许我们在定义集合时指定元素类型。在选项D中,`List&lt;? extends A&gt;`表示列表包含A的子类对象...

    超市售物系统(SE小程序)

    在售物系统中,ArrayList、LinkedList、HashMap等集合类型可能会被用来管理商品库存、客户信息和订单数据,便于高效地进行增删查改操作。 3. **线程**:为了实现系统的实时性,可能使用多线程来处理并发任务。比如...

    Java随机文件存储杂货店问题

    // 定位到对应记录号的位置,然后读取并解析信息 } // 修改商品 public void updateGroceryItem(GroceryItem item) throws IOException { // 先找到旧的记录,然后替换为新的商品信息 } } ``` 为了有效地...

Global site tag (gtag.js) - Google Analytics