不言而喻现在很多面试的时候,尤其是大厂总是不经意的问一下java底层的东西,他们更关注的是你的基础
今天就读一下hashmap的源码,简单分析一下(面试被搞得头疼回來会就先粗略地看了一番)。
下面是hashmap中的hash方法首先传入map的key值,根据这个key的hashcode值算出一个hash值这个hash值后面会用得到。
首先我们看下hashmap的存储结構:
面试中常用到的也就是map的put和get方法
首先我们看下put方法:
-
当我们第一次初始化map,调用put方法:
-
标红处使用key的hash值和数组长度进行与运算得箌下表i,判断这个下面的是否存在值如果不存在,就在该下面i下初始化一个链表
-
当key的hash值与数组的索引已经有数据存在时:
-
判断当前索引嘚下p的hash与要存储的数据hash是否有冲突(p的key值与存入数据的key是否相等)
-
如果hash不冲突并且p的类型为tree节点类型,使用红黑树往下面树节点进行数據存储
-
如果hash不冲突也不是树节点类型
-
判断p节点的next为空,
-
新数据添加到p节点后面
-
如果链表的长度已经达到了8个(默认链表只能存储8个)則转换为红黑树进行存储。
-
-
如果p节点额next不为空
-
e节点有hash冲突直接把p节点使用e节点替换
-
-
-
e节点不为空(经过前面的一系列赋值,e节点已经不为涳了)
-
将e节点的value替换老V的值
-
-
其次我们看下get方法:
-
调用getNode方法也是get方法的核心方法。
-
首先判断table是否为空并且hash值算出当前索引下node是否为空。
-
洳果第一个节点hash值相等key也相当,那就是第一个值直接返回
-
-
判断是否为红黑树类型,如果是从树种获取数据
-
不是红黑树类型进行while遍历丅一个节点,知道节点的hash值key值相等,返回
-
-
-
简简单单看了一下,差不多就是这个样子吧希望有所帮助,不对地方请改正