HashMap是java集合中最常用的几种集合之一,其在java8版本之后,采用了数组+链表+红黑树的结构实现,其中,数组是HashMap的主体,而当产生哈希冲突时,就会形成链表,当链表长度超过阈值时,链表会转换为红黑树。由于其是一段连续的存储单元,所以在查询方面速度较快,时间复杂度为O(1),而在删除和新增则相对会慢一些,时间复杂度为O(n),其常用两种方法,一种是put,一种是get,其中,get方法的源码如下:
计算key的hash值,找到数组中的位置,检查第一个节点,如果第一个节点不匹配,则进行判定,如果是树节点,则调用树节点的查找方法;如果是链表,就遍历链表查找,如果可以找到,则返回节点,否则返回null。
而put方法的流程是:先计算key的hash值,如果数组为空,初始化数组(默认大小16),计算元素在数组中的位置,如果该位置为空,直接插入,如果该位置不为空,则判断key值:如果key相同,覆盖value,如果是树节点,调用树节点的插入方法,如果是链表,遍历链表,如果找到相同key则覆盖,否则插入链表尾部,插入后判断链表长度是否超过8,超过则转换为红黑树,如果size超过阈值,进行扩容。