关于HashMap

本文详细解析了HashMap在JDK1.8中的实现原理,包括其基于哈希表、数组、链表和红黑树的存储结构。HashMap提供高效的查找速度,但不保证遍历顺序。其负载因子默认为0.75,当链表长度超过8时转换为红黑树。插入数据时,通过hashCode()计算存储位置。HashMap在多线程环境下不是线程安全的,需要额外同步措施。
摘要由CSDN通过智能技术生成

HashMap类主要用来处理具有键值对特征的数据,随着JDK版本的更新,JDK1.8对HashMap底层也进行了优化

1、 HashMap是基于哈希表对Map接口的实现,HashMap具有较快的访问速度,但遍历顺序却是不确定的。

2、HashMap 提供所有可选的映射操作,并允许使用null值和null键  new HashMap<>().put(null,null) 

3、HashMap是线程不安全的,当存在多个线程同时写入HashMap时,可能会导致数据的不一致。

1、loadFactor称为负载因子,默认值为0.75

2、threshold表示所能容纳的键值对的临界值,threshold计算公式为数组长度 * 负载因子

3、size是HashMap中实际存在的键值对数量

4、modCount字段用来记录HashMap内部结构发生变化的次数

5、HashMap的默认容量INITIAL_CAPACITY为16

 HashMap采用了数组+链表+红黑树(jdk1.8)的存储结构

HashMap数组部分称为哈希桶,当链表长度大于等于8时,链表数据将以红黑树的形式进行存储,当长度降到6时,转为链表 (链表的时间复杂度为O(n),红黑树的时间复杂度为O(log n))。

每个Node节点存储着用来定位数据索引位置的hash值,K键,V值以及指向链表下一个节点的Node<K,V> next节点组成。Node是HashMap的内部类,实现了Map.Entry接口,本质是一个键值对 

当向HashMap中插入数据时,首先要确定在哈希桶数组中的位置,那么如何确定node的存储位置呢?

HashMap首先调用hashCode()方法,获取键key的hashCode值,然后对其进行高位运算

将其右移16位,获取高16位,与原低16位进行异或运算

最后将得到的h值与(table.length -1)进行与运算获得该对象的保留位以计算下标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值