资讯专栏INFORMATION COLUMN

hashmap源码分析

codercao / 3215人阅读

摘要:源码解析的数据存储结构中的都是存在数组中的数据节点的数据结构是一个单向的链表,,实现了的接口,即实现了,,等这些函数,这些都是基本的读取修改值的函数。的作用是判断是否包含的作用是判断是否包含值为的元素

HashMap源码解析 hashmap的数结构
(1)在Java中,数据结构分为两种,一种是数组,另一个是模型指针即引用,所有的数据结构都可以用这两种基本结构所构造,HashMap就是一个数组和链表的结合体,即通过hashcode找到数组中的某一个元素,然后通过key的equals方法在链表中找到key的位置对应的value。

(2)当创建一个hashmap的时候,就会初始化一个entry的数组,每一个entry的数组元素会持有一个指向下一个元素的引用,这就构成了链表。当我们往hashmap中put元素的是时候,先跟住key的hash值得到这个元素在数组中的位置(即下标)然后可以把这个元素放在对应的位置之中了,如果这个位置继续放其他的元素,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的就会放在链未,从hashmap之中get元素的时候,首先计算hashmap的key值得hashcode,找到数组中对应位置的某一个元素,然后通过key的equals方法在对应的位置的链表中找到需要的元素,其实也就是说,如果每一个链表的位置只有一个元素,那么hashmap的get的效率是最高的。
hash算法

(1)首先先算的key的hashcode的值,然后和数组长度-1做一次&,这样就可以保证得到与数组index相同的几率较小,那么数据在数组上分布的就比较均匀,也就是碰撞率较小,响应的提高了查询的效率。

hashmap的扩容
(1)当hashmap中的元素越来越多的时候,碰撞的几率就会直线上升,为了提高查询的效率,就要对hashmap的数组进行扩容,而在hashmap数组扩容时候,原数组中的数据必须重新计算其在新数组中的位置,并放进去,这个过程叫resize,而这个过程十分耗时,所以说,尽量在声明的时候,就定义它的大小。
hashmap 源码解析

(1)hashmap的数据存储结构

transient Entry[] table
hashmap中的key-value都是存在entry数组中的

(2)数据节点entry的数据结构

entry是一个单向的链表,entr,实现了map.entry 的接口,即实现了getkey(),getvalue(),setvalue()
,equals(),hashcode()等这些函数,这些都是基本的读取/修改key、value 值的函数。

(3)hashmap的构造函数

  (1. 默认构造函数  hashmap();

  (2. 指定容量大小和加载因子的构造函数 hashmap(int initalcapaciry,float loadFactor)

   (3. 指定容量大小的构造函数 hashmap(int initialcapacity)

   (4. 包含map的构造函数 hashmap(map m)

(4) clear()

   clear()的作用是清空hashmap,它是通过将所有的元素设置为null来实现的。

(5)containsKey()

  containsKey()的作用是判断hashmap是否包含key

(6)containsValue()

  containsValue()的作用是判断hashmap是否包含值为value的元素

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71220.html

相关文章

  • HashMap源码分析(一):JDK源码分析系列

    摘要:当一个值中要存储到的时候会根据的值来计算出他的,通过哈希来确认到数组的位置,如果发生哈希碰撞就以链表的形式存储在源码分析中解释过,但是这样如果链表过长来的话,会把这个链表转换成红黑树来存储。 正文开始 注:JDK版本为1.8 HashMap1.8和1.8之前的源码差别很大 目录 简介 数据结构 类结构 属性 构造方法 增加 删除 修改 总结 1.HashMap简介 H...

    wdzgege 评论0 收藏0
  • HashSet源码分析:JDK源码系列

    摘要:简介继续分析源码,上一篇文章把的分析完毕。本文开始分析简单的介绍一下。存储的元素是无序的并且允许使用空的元素。 1.简介 继续分析源码,上一篇文章把HashMap的分析完毕。本文开始分析HashSet简单的介绍一下。 HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承了下来。存储的元素是无序的并且HashSet允许使用空的元素。 HashSe...

    用户83 评论0 收藏0
  • HashMap 源码详细分析(JDK1.8)

    摘要:则使用了拉链式的散列算法,并在中引入了红黑树优化过长的链表。如果大家对红黑树感兴趣,可以阅读我的另一篇文章红黑树详细分析。构造方法构造方法分析的构造方法不多,只有四个。 1.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap。HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值...

    monw3c 评论0 收藏0
  • java源码

    摘要:集合源码解析回归基础,集合源码解析系列,持续更新和源码分析与是两个常用的操作字符串的类。这里我们从源码看下不同状态都是怎么处理的。 Java 集合深入理解:ArrayList 回归基础,Java 集合深入理解系列,持续更新~ JVM 源码分析之 System.currentTimeMillis 及 nanoTime 原理详解 JVM 源码分析之 System.currentTimeMi...

    Freeman 评论0 收藏0
  • HashMap源码分析

    摘要:线程安全关于线程安全,我们想要知道的是在什么情况下会发生线程不安全的情况实际上,在上文分析方法时,当的容量超过了时,便执行操作,就存在线程不安全的问题。实现了所谓的线程安全,在很多方法上都加上了。 HashMap简介 本文针对HashMap的源码分析基于JDK 7,JDK 8在HashMap的实现上有着较大幅度的改进和优化,这部分优化我将另起一篇来阐述。另外,本文仅分析HashMap众...

    zhkai 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<