【java开发底层原理篇】之hashmap实现原理

142 阅读3分钟

前言: java开发中,hashmap实现底层原理是必须要懂得的知识点,也是面试必考点。此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...

一、HashMap基础知识

1.内部存储结构:数组+链表+红黑树(JDK8)  

2.默认容量16,默认装载因子0.75。  

3.key和value对数据类型的要求都是泛型。  

4.key可以为null,放在table[0]中。  

5.hashcode:计算键的hashcode作为存储键信息的数组下标用于查找键对象的存储位置。

6.equals:HashMap使用equals()判断当前的键是否与表中存在的键相同。

数组中保存一个对象,对象包括(key,value,next),next是找到下一个结点

二、put()方法原理

put()时,HashMap会先遍历table数组,用hash值和equals()判断数组中是否存在完全相同的key对象, 如果这个key对象在table数组中已经存在,就用新的value代替老的value。如果不存在,就创建一个新的Entry对象添加到table[ i ]处。

三、get()方法原理:

如果两个不同的key的hashcode相同,两个值对象储存在同一个bucket位置,要获取value,我们调用get()方法,HashMap会使用key的hashcode找到bucket位置,因为HashMap在链表中存储的是Entry键值对,所以找到bucket位置之后,会调用key的equals()方法,按顺序遍历链表的每个 Entry,直到找到想获取的 Entry 为止——如果恰好要搜索的 Entry 位于该 Entry 链的最末端(该 Entry 是最早放入该 bucket 中),那HashMap必须循环到最后才能找到该元素。

如果该table[ i ]已经存在其他元素,那么新Entry对象将会储存在bucket链表的表头,通过next指向原有的Entry对象,形成链表结构(hash碰撞解决方案)。

数组的特点是: 寻址容易,插入和删除困难;
链表的特点是: 寻址困难,插入和删除容易。

哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。

四、什么是hash

他是将一个任意长度的二进制值通过一个映射关系转换成一个固定长度的二进制值,hash表最重要的特点,存储效率很高,获取数据的效率也高。
hash通过一个key一个输入,通过一个哈希函数,来找到数组下标中与这个key唯一映射的value,根据这个hash函数,找到数组中这个value的下标

五、相关面试题

1.使用put方法,添加一样的key,不同的值,问值有两个还是一个,然后又问,为何是x个,说来听听

答: 重写hashCode()和equals()方法即可实现添加重复元素。

详情请查看博客 : HashMap实现相同key存入数据后不被覆盖

2、使用HashMap在什么情况会出现内存泄漏?

答:
GC无法正常回收
集合在程序中被大循环调用,不断在内存中创建无法被垃圾回收机制回收的集合对象,当程序运行到一定时期时集合对象就会沾满内存,造成内存溢出。
hashMap集合并没有跟随该方法的运行结束而被释放.因为集合装载有一个静态常量
hashMap.put(null, i);//静态变量,hashMap集合并没有跟随该方法的运行结束而被释放.因为集合装载有一个静态常量


结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)