HashMap实现原理理解

原创 2018年04月17日 21:41:04

    很多童鞋看过很多关于HashMap的文章, 但是还是对其一知半解,感觉灰常复杂,难以理解与掌握,即便看了源码,也是云里雾里。包括本人也是如此。

    好,闲话少说,进入正题。

    HashMap大家经常都有用到,对于put、get、Entry三个东东都不会陌生,大家都知道HashMap允许null键null值,不允许重复的Key,并且HashMap能够扩容,在线程安全方面,HashMap不是同步的。但是大家知道这是为什么吗?回答了这些个问题,就相当于回答了HashMap的实现原理。

    下面我将从HashMap的数据结构上来回答这个问题。

    在讲下面的内容之前,先要明白HashMap的几个重要属性:初始容量、因子、Entry<K,y>[]。Entry大家可能都知道,但是初始容量和因子可能就不是很清楚了。我们平时构造一个HashMap对象的时候,一般都是使用HashMap()构造器,其实HashMap还有另外三个构造器,其中两个构造器的参数中就包含了初始容量和因子。如图:

    

那么,初始容量与因子是什么意思,起到什么作用呢?

初始容量的意思就是HashMap的初始大小;因子的作用是,当当前的HashMap容量使用超过75%时,HashMap将触发容量扩容,扩容之后的容量是原来的两倍。

HashMap的扩容是怎么回事呢?

因为HashMap的键值对其实是存储在Entry<K,V>[]数组中的。数组本身不会自动扩容,是因为HashMap去实现了这个功能,对于外部使用者的我们,我们感知不到其内部的变化,感觉上就好像HashMap存多少键值对都可以,真的灰常神奇,其实并没有那么腻害,它只不过是把键值对存储在内部类Entry<K,V>数组中,HashMap的扩容的过程只不过是创建一个容量是原来Entry数组容量两倍的新的Entry<K,V>[]数组,并将原来的Entry数组中的元素拷贝的新的Entry数组中,老的Entry数组丢弃,这就完成了扩容,其实一点也不神秘。

HashMap允许null键null值,不允许重复的Key,为什么?

put方法的实现,就说明了这个问题。 

简单的说,当put(K,V)的时候,检查K是不是null,如果是null,就存到null键值对中;如果不是null,就检查K在HashMap中是否存在,如果存在就覆盖掉V值,否则就新增一个键值对。

深一点来说,如何判断一个K在HashMap中是否存在呢?put的时候, 我们首先是hsah(K)获取K的hash值,然后根据hash值和Entry数组的长度去获取hash值在Entry数组中的位置,然后,从这个位置开始遍历Entry数组,找到一个不等于null的元素e,如果hash == e.hash && (K == e.key || K.equals(e.k)),则说明这个K在HashMap中存在,否则就addEntry。 这就是为什么HashMap允许null键null值,以及不允许重复Key的原因。        

还有好多没有写,以后再补充吧.............................


HashMap底层实现原理及面试问题

①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来...
  • xiaohua_meng
  • xiaohua_meng
  • 2017-09-19 18:24:10
  • 437

深入理解Java中的HashMap的实现原理

1. HashMap为了提高查找的效率使用了分块查找的原理,对象的hashCode返回的哈希值进行进一步处理,这样就有规律的把不同的元素放到了不同的区块或桶中。下次查找该对象的时候,还是计算其哈希值,...
  • sunqunsunqun
  • sunqunsunqun
  • 2015-06-22 18:44:08
  • 3560

HashMap的底层工作原理和并发问题

源码分析首先来看下HashMap一个典型的构造函数:transient HashMapEntry[] table;public HashMap(int capacity) { if (capac...
  • whsdu929
  • whsdu929
  • 2016-09-19 20:26:31
  • 1104

JAVA HashMap底层实现原理

1.    HashMap概述:    HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该...
  • wangxin1982314
  • wangxin1982314
  • 2016-01-14 10:54:00
  • 2604

HashMap的实现原理以及面试官的提问

HashMap:按照特性来说明一下,储存的是键值对,线程不安全,非Synchronied,储存的比较快,能够接受null。按照工作原理来叙述一下,Map的put(key,value)来储存元素,通过g...
  • qq_32519097
  • qq_32519097
  • 2016-10-04 17:45:07
  • 2457

面试题--HashMap底层的实现

首先我们来看看HashMap的底层源码 /** * Constructs an empty HashMap with the default initial capacity * (16) a...
  • Mrzhoug
  • Mrzhoug
  • 2016-04-20 08:42:09
  • 779

Java中HashMap底层实现原理(JDK1.8)源码分析

这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JD...
  • tuke_tuke
  • tuke_tuke
  • 2016-06-05 11:13:44
  • 22975

HashMap原理详讲

对于HashMap的学习我们需要注意的概念和问题有 1、什么是HashMap以及HashMap的构成 2、HashMap的基本存储原理以及存储内容的组成 3、HashMap的工作原理以及存取方法...
  • lyt_7cs1dn9
  • lyt_7cs1dn9
  • 2017-02-08 13:34:45
  • 4488

HashMap的实现原理

  • 2016年12月12日 10:29
  • 573KB
  • 下载

HashMap的工作原理--重点----数据结构示意图的理解

HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间的区别,那么为何这道面试题如此...
  • qq_27093465
  • qq_27093465
  • 2016-08-15 11:43:20
  • 8092
收藏助手
不良信息举报
您举报文章:HashMap实现原理理解
举报原因:
原因补充:

(最多只允许输入30个字)