Java中HashMap底层原理、ConcurrentHashMap

HashMap底层原理

HashMap基于哈希表的Map接口实现。HashMap存储的是键值对(key-value)映射,并且允许使用null作为键(key)和值(value)。要注意的是,HashMap只允许有一条记录的键为null,但允许多条记录的值为null。

HashMap的底层实现主要由数组、链表、红黑树组成。当我们使用put(key, value)方法向HashMap中添加元素时,会首先计算key的哈希值,然后使用这个哈希值对数组长度取模,得到的结果就是该元素在数组中的下标位置。如果在这个位置上已经存在其他元素(哈希冲突),就会使用链表来存储这些具有相同哈希值的元素。在JDK 1.8及以后的版本中,当链表长度超过一定阈值(默认为8)时,链表会转换为红黑树以提高查询效率。

  1. 数组:HashMap的主干是数组。当我们要新增或查找某个元素时,首先通过哈希函数(hash函数)计算出该元素的关键字对应的哈希值,然后利用这个哈希值对数组长度取模(在Java中,这个过程实际上是使用哈希值的高位和低位进行异或运算,然后对数组长度进行取余,这被称为位运算),得到的结果即为该元素在数组中的下标位置。
  2. 链表:当两个或多个元素经过哈希函数计算后得到相同的下标位置时,就发生了哈希冲突。为了解决哈希冲突,HashMap采用链表的方式存储这些具有相同哈希值的元素。在JDK 1.8之前,HashMap使用的是头插法插入新节点,而在JDK 1.8及之后,HashMap改为了尾插法。
  3. 红黑树:随着链
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值