阅读 69

HashMap光听名字就觉得霸气侧漏

什么是HashMap?

HashMap是用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对分散存储在一个数组当中,这个数组就是HashMap的主干。
JDK1.8之前HashMap由 数组+链表 组成的。
JDK1.8以后在解决哈希冲突时有了较大的变化,当链表长度大于默认为8时,将链表转化为红黑树,将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。
HashMap数组每一个元素的初始值都是Null。
它的默认长度是16
对于HashMap,我们最常使用的是两个方法:Get 和 Put。

Put()源码分析

调用 hashMap.put("girl", 0) ,插入一个Key为“girl"的元素。这时候我们需要利用一个哈希函数来确定Entry的插入index位置:index = Hash("girl");

添加元素的分析

  1. 首先是判断是否需要扩容。
  2. 根据hash("girl")计算数组的下标。
  3. 如果定位到的数组位置有元素就和要插入的key比较,如果key相同就直接覆盖。
  4. 如果key不相同,就判断p是否是一个树节点,如果是就调用e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value)将元素添加进入。
  5. 如果不是就遍历链表插入(插入的是链表尾部)。

Get()源码分析

和put相似,首先是根据key的hash值算出数组下标。并且比较key的值是否比配。匹配直接返回value值,不匹配就看链表下一个节点。

文章分类
后端
文章标签