HashMap

151 阅读2分钟

HashMap的实现原理:

HashMap是基于哈希表的map接口的非同步实现,它允许使用null值作为key和value。在Java编程语言中最基本的结构就是两种,一种是数组,另一种是模拟指针(引用)。所有的数据结构都可以用这两个基本的结构来构造,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构。即数组和链表的结合体。

 

从图上可以看出,HashMap底层就是一个数据结构,数组中的每一项又是一个链表。

冲突:

HashMap中调用Hashcode()方法计算Hashclde值,由于Java中两个不同的对象可能有一样的Hashcode。就导致了冲突的产生。

解决:

HashMap在put时候,底层源码可以看出,当程序试图将一个key-value对象放入到HashMap中,首先根据该key的hashCode()返回值决定该Entry的存储位置,如果两个Entry的key的hashCode()方法返回值相同,那他们的存储位置相同,如果这两个Entry的key通过equals比较返回true,新添加的Entry的value将会覆盖原来的Entry的value,但是key不会被覆盖,反之,如果返回false,新添加的Entry将与集合中原有的Entry形成Entry链,新添加的位于头部,旧的位于尾部。

存:取:

 

HashMap的实现原理:

利用key的hashCode重新hash计算出当前对象的元素在数组中的下标。 存储时如果出现hash值相同的key,分两种情况:1、如果key相同,则覆盖原来的值。2、如果key不同(出现冲突),则放在链表中。 获取时,直接找到hash值对应的下标,再进一步判断key是否相同,从而拿到对应的值。 Hashmap的核心就是使用数组进行存储,出现key冲突的时候,就存放在链表中。