HashMap底层原理
HashMap基于哈希表的Map接口实现。HashMap存储的是键值对(key-value)映射,并且允许使用null作为键(key)和值(value)。要注意的是,HashMap只允许有一条记录的键为null,但允许多条记录的值为null。
HashMap的底层实现主要由数组、链表、红黑树组成。当我们使用put(key, value)方法向HashMap中添加元素时,会首先计算key的哈希值,然后使用这个哈希值对数组长度取模,得到的结果就是该元素在数组中的下标位置。如果在这个位置上已经存在其他元素(哈希冲突),就会使用链表来存储这些具有相同哈希值的元素。在JDK 1.8及以后的版本中,当链表长度超过一定阈值(默认为8)时,链表会转换为红黑树以提高查询效率。
- 数组:HashMap的主干是数组。当我们要新增或查找某个元素时,首先通过哈希函数(hash函数)计算出该元素的关键字对应的哈希值,然后利用这个哈希值对数组长度取模(在Java中,这个过程实际上是使用哈希值的高位和低位进行异或运算,然后对数组长度进行取余,这被称为位运算),得到的结果即为该元素在数组中的下标位置。
- 链表:当两个或多个元素经过哈希函数计算后得到相同的下标位置时,就发生了哈希冲突。为了解决哈希冲突,HashMap采用链表的方式存储这些具有相同哈希值的元素。在JDK 1.8之前,HashMap使用的是头插法插入新节点,而在JDK 1.8及之后,HashMap改为了尾插法。
- 红黑树:随着链