ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HashMap详解

2021-09-24 14:36:22  阅读:206  来源: 互联网

标签:key HashMap 链表 详解 数组 loadFactor entry


什么是链表散列呢?

  通过数组和链表结合在一起使用,就叫做链表散列。这其实就是hashmap存储的原理图。

 

 HashMap的数据结构就是用的链表散列,大概是怎么存储的呢?分两步

  1、HashMap内部有一个entry的内部类,其中有四个属性,我们要存储一个值,则需要一个key和一个value,存到map中就会先将key和value保存在这个Entry类创建的对象中。

  2、构造好了entry对象,然后将该对象放入数组中,如何存放就是这hashMap的精华所在了。

      大概的一个存放过程是:通过entry对象中的hash值来确定将该对象存放在数组中的哪个位置上,如果在这个位置上还有其他元素,则通过链表来存储这个元素。

    

 

HashMap存放元素的大概过程?

  通过key、value封装成一个entry对象,然后通过key的值来计算该entry的hash值,通过entry的hash值和数组的长度length来计算出entry放在数组中的哪个位置上面,每次存放都是将entry放在第一个位置。在这个过程中,就是通过hash

 

loadFactor加载因子

   loadFactor加载因子是控制数组存放数据的疏密程度,loadFactor越趋近于1,那么数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,loadFactor越小,也就是趋近于0,那么数组中存放的数据也就越稀,也就是可能数组中每个位置上就放一个元素。那有人说,就把loadFactor变为1最好吗,存的数据很多,但是这样会有一个问题,就是我们在通过key拿到我们的value时,是先通过key的hashcode值,找到对应数组中的位置,如果该位置中有很多元素,则需要通过equals来依次比较链表中的元素,拿到我们的value值,这样花费的性能就很高,如果能让数组上的每个位置尽量只有一个元素最好,我们就能直接得到value值了,所以有人又会说,那把loadFactor变得很小不就好了,但是如果变得太小,在数组中的位置就会太稀,也就是分散的太开,浪费很多空间,这样也不好,所以在hashMap中loadFactor的初始值就是0.75,一般情况下不需要更改它。

 

Size的意思?

  size就是在该HashMap的实例中实际存储的元素的个数

 

threshold的作用?

  threshold = capacity * loadFactor,当Size>=threshold的时候,那么就要考虑对数组的扩增了,也就是说,这个的意思就是衡量数组是否需要扩增的一个标准。注意这里说的是考虑,因为实际上要扩增数组,除了这个size>=threshold条件外,还需要另外一个条件,这个就等在源码中看吧。

 

什么是桶?

  根据前面画的HashMap存储的数据结构图,你这样想,数组中每一个位置上都放有一个桶,每个桶里就是装一个链表,链表中可以有很多个元素(entry),这就是桶的意思。也就相当于把元素都放在桶中。

 

capacity

  这个就代表的数组的容量,也就是数组的长度,同时也是HashMap中桶的个数。默认值是16.

 

HashMap的继承结构和实现的接口

  

        继承结构很简单:上面就继承了一个abstractMap,也就是用来减轻实现Map接口的编写负担

                

 

        实现的接口:

                

              Map<K,V>:在AbstractMap抽象类中已经实现过的接口,这里又实现,实际上是多余的。但每个集合都有这样的错误,也没过大影响

              Cloneable:能够使用Clone()方法

              Serializable:能够使之序列化

标签:key,HashMap,链表,详解,数组,loadFactor,entry
来源: https://www.cnblogs.com/zuiqiangJAVA/p/15330226.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有