java.util.HashMap源码学习(一)

本文深入探讨了Java中的HashMap数据结构及其实现原理,包括其内部数组、单向链表的使用方式,以及如何通过hash码快速定位数据。同时,还详细介绍了HashMap的重要字段及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.util.HashMap:

table数组中存放的是单向链表Entry,Entry中存放的实际数据,一个链表中可能有多个数据,由这些数据的Key可以算出hashCode得到在table中的相同的“桶位”。hashMap能实现快速定位,就是利用了这一特点。不需要对所有数据进行迭代,利用key的hashCode快速找到“桶位”,然后只在桶位中单向链表中的少量数据中进行迭代,所以速度很快。通过由key生成的hash码,可以找到table数组中对应的单向链表Entry,然后在Entry中找到对应的key,从而取出value。

HashMap中重要的字段:

1. DEFAULT_INITIAL_CAPACITY
默认的table数组大小,如果没有通过构造函数指定则table数组的大小使用此值
2. MAXIMUM_CAPACITY
数组table的最大容量
3. DEFAULT_LOAD_FACTOR
默认的装载因子,如果没有指定则使用此值
4. Entry[] table
存放Entry的数组,以hash码作为下标
5. int size
hashMap的大小
6. int threshold
阈值,hashMap存放内容数量的临界点,当存放量大于这个值的时候,就需要将table进行扩张,新建一个两倍大的数组,并将老的元素移过去。threshold = (int)(capacity * loadFactor)
7. float loadFactor
装载因子,实际存放量/capacity容量的比值
8. int modCount
记录hashMap结构变化的次数,使用在hashMap的fail-fast机制中(当某个线程获取map的游标后,另一个线程对map做了结构修改的操作,那么原先准备遍历的线程会抛出ConcurrentModificationException异常)

HashMap的构造函数:

1. HashMap(int initialCapacity, float loadFactor)
使用指定的初始容量,和装载因子构造hashMap。如果initialCapacity<0或loadFactor<=0或loadFactor是非法的浮点类型时抛出IllegalArgumentException异常。当initialCapacity> MAXIMUM_CAPACITY时初始容量等于MAXIMUM_CAPACITY。hashMap的容量必须是2的倍数,所以实际的初始容量会可能会大于initialCapacity。
2. HashMap(int initialCapacity)
使用指定的初始容量,装载因子为DEFAULT_LOAD_FACTOR。
3. HashMap()
初始容量和装载因子均为默认值
4. HashMap(Map<? extends K, ? extends V> m)
从现有的map构造新的hashMap。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值