Java基础学习:hashmap定义_极悦注册
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java基础学习:hashmap定义

Java基础学习:hashmap定义

更新时间:2020-04-30 14:07:13 来源:极悦 浏览3805次

    一、HashMap基础

    基本定义:根据源代码的描述可知,HashMap是基于哈希表的Map接口的实现,其包含了Map接口的所有映射操作,并且允许使用null键和null值。

    与HashTable的区别:HashMap可以近似地看成是HashTable,但是它是非线程安全的,并且允许使用null键和null值,而这些都与HashTable恰巧相反。

    注:HashMap可以使用ConcurrentHashMap代替,ConcurrentHashMap是一个线程安全,更加快速的HashMap。

    存储结构:HashMap的存储结构其实就是哈希表的存储结构(由数组与链表结合组成,称为链表的数组)。如下图所示:

Java基础学习:hashmap定义

    /**

    *Thetable,initializedonfirstuse,andresizedas

    *necessary.Whenallocated,lengthisalwaysapoweroftwo.

    *(Wealsotoleratelengthzeroinsomeoperationstoallow

    *bootstrappingmechanicsthatarecurrentlynotneeded.)

    */

    transientNode[]table;

    staticclassNodeimplementsMap.Entry{

    finalinthash;

    finalKkey;

    Vvalue;

    Nodenext;

    ...

    }

    HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。

    如上图所示,HashMap中元素存储的形式是键-值对(key-value对,即Entry对),所有具有相同hashcode值的键(key)所对应的entry对会被链接起来组成一条链表,而数组的作用则是存储链表中第一个结点的地址值。

    二、影响HashMap性能的因素

    在HashMap中,还存在着两个概念,桶(buckets)和加载因子(loadfactor)。

    桶(buckets):上图中的标有0、1、2、3、….、11所对应的数组空间就是一个个桶。

    加载因子(loadfactor):是哈希表在其容量自动增加之前可以达到多满的一种尺度,默认值是0.75。

    根据源代码中所述,影响HashMap性能有两个因素:哈希表中的初始化容量(桶的数量)和加载因子。当哈希表中条目数超过了当前容量与加载因子的乘积时,哈希表将会作出自我调整,将容量扩充为原来的两倍,并且重新将原有的元素重新映射到表中,这一过程成为rehash。看到这里,相必大家会发现rehash操作是会造成时间与空间的开销的,因此为什么初始化容量与加载因子会影响HashMap的性能也就可以理解了。

    三、put/get方法实现原理

    put操作:HashMap在进行put操作的时候,会首先调用Key值中的hashCode()方法,用于获取对应的bucket的下标值以便存放数据。

    HashMap通过key值的hashCode获得了对应的bucket存储空间的下标,然后进入bucket空间,通过链表遍历的方式逐个查询,看看链表中是否已经存在了这个key的键-值对,如果已经存在则用新值替换旧值,否则插入新的键-值对。

    看到这里,相信大家会发现,hashCode值相同的两个值可能是不同的两个对象,而当put进去的是另一个hashCode值相等的对象时,会发生冲突,而在HashMap中解决这种冲突的方法就是将hashCode值相同的key值所对应的key-value对串联成一条链表,请见上面的HashMap数据结构图。

    get操作:HashMap在进行get操作的时候,与put方法类似,会首先调用Key值中的hashCode()方法,用于获取对应的bucket的下标值,找到bucket的位置后,再通过key.equals()方法找到对应的键-值对,从而获得对应的value值。

    总结

    HashMap是基于hashing原理对key-value对进行存储与获取,当使用put()方法添加key-value对时,它会首先检查hashCode的值,并以此获得对应的bucket位置进行存储,当发生冲突时(hashCode值相同的两个不同key),新的key-value对会以结点的形式添加到链表的末尾(先看看链表中是否已经存在了这个key,如果已经存在,则更新;否则就添加到链表的末尾)。而使用get()方法时,同样地会根据key的hashCode值找到相应的bucket位置,再通过key.equals()方法找到对应的key-value对,最终成功获取value值。

Java基础学习:hashmap定义

 以上就是极悦java培训机构的小编针对“Java基础学习:hashmap定义”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>