5. HashMap
的性能参数:
HashMap
包含如下几个构造器:
HashMap()
:构建一个初始容量为
16
,负载因子为
0.75
的
HashMap
。
HashMap(int initialCapacity)
:构建一个初始容量为
initialCapacity
,负载因子为
0.75
的
HashMap
。
HashMap(int initialCapacity, float loadFactor)
:以指定初始容量、指定的负载因子创建一个
HashMap
。
HashMap
的基础构造器
HashMap(int initialCapacity, float loadFactor)
带有两个参数,它们是初始容量
initialCapacity
和加载因子
loadFactor
。
initialCapacity
:
HashMap
的最大容量,即为底层数组的长度。
loadFactor
:负载因子
loadFactor
定义为:散列表的实际元素数目
(n)/
散列表的容量
(m)
。
负载因子衡量的是一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。对于使用链表法的散列表来说,查找一个元素的平均时间是
O(1+a)
,因此如果负载因子越大,对空间的利用更充分,然而后果是查找效率的降低;如果负载因子太小,那么散列表的数据将过于稀疏,对空间造成严重浪费。
HashMap
的实现中,通过
threshold
字段来判断
HashMap
的最大容量:
threshold = (int)(capacity * loadFactor);
结合负载因子的定义公式可知,
threshold
就是在此
loadFactor
和
capacity
对应下允许的最大元素数目,超过这个数目就重新
resize
,以降低实际的负载因子。默认的的负载因子
0.75
是对空间和时间效率的一个平衡选择。当容量超出此最大容量时,
resize
后的
HashMap
容量是容量的两倍:
if (size++ >= threshold)
resize(2 * table.length);
6. Fail-Fast
机制:
我们知道
java.util.HashMap
不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了
map
,那么将抛出
ConcurrentModificationException
,这就是所谓
fail-fast
策略。
这一策略在源码中的实现是通过
modCount
域,
modCount
顾名思义就是修改次数,对
HashMap
内容的修改都将增加这个值,那么在迭代器初始化过程中会将这个值赋给迭代器的
expectedModCount
。
HashIterator() {
expectedModCount = modCount;
if (size > 0) { // advance to first entry
Entry[] t = table;
while (index < t.length && (next = t[index++]) == null)
;
}
}
在迭代过程中,判断
modCount
跟
expectedModCount
是否相等,如果不相等就表示已经有其他线程修改了
Map:
注意到
modCount
声明为
volatile
,保证线程之间修改的可见性。
final Entry<K,V> nextEntry() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
在
HashMap
的
API
中指出:
由所有
HashMap
类的
“collection
视图方法
”
所返回的迭代器都是快速失败的:在迭代器创建之后,如果从结构上对映射进行修改,除非通过迭代器本身的
remove
方法,其他任何时间任何方式的修改,迭代器都将抛出
ConcurrentModificationException
。因此,面对并发的修改,迭代器很快就会完全失败,而不冒在将来不确定的时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为不能得到保证,一般来说,存在非同步的并发修改时,不可能作出任何坚决的保证。快速失败迭代器尽最大努力抛出
ConcurrentModificationException
。因此,编写依赖于此异常的程序的做法是错误的,正确做法是:迭代器的快速失败行为应该仅用于检测程序错误。
参考资料:
JDK API HashMap
HashMap
源代码
深入理解HashMap
通过分析 JDK 源代码研究 Hash 存储机制
java.util.HashMap源码要点浅析
相关推荐
在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...
文件"深入Java集合学习系列:HashMap的实现原理 - 莫等闲 - ITeye技术网站.mht"将详细解析HashMap的内部节点结构、扩容机制以及处理哈希冲突的方法。 接下来,ArrayList是一个动态数组,它继承自AbstractList并实现...
HashMap 是 Java 中最常用的集合类之一,它是基于哈希表数据结构实现的,提供快速的存取操作。在深入理解 HashMap 的实现原理之前,我们先要明白哈希表的基本概念。哈希表是一种通过哈希函数将键(Key)映射到数组...
·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...
Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合...
HashMap是Java集合框架中Map接口的典型实现之一,主要用于存储键值对(Key-Value)数据。其特性如下: - 线程不安全,方法为非同步方法,因此多线程环境下访问可能会出现并发问题。 - 允许使用null作为键(Key)和...
首先,我们来看"深入Java集合学习系列(一):HashMap的实现原理_尚硅谷_张晓飞.pdf"。HashMap是Java中常用的键值对存储容器,它的主要特点是查找速度快,平均时间复杂度为O(1)。HashMap内部使用了哈希表的数据结构,...
【Java软件技术文档-深入Java8的集合5:Hashtable的实现原理】 在Java编程语言中,集合框架是不可或缺的一部分,而Hashtable是其中一种古老的、线程安全的哈希表实现。尽管现在更多地使用HashMap或...
这里我们将深入探讨这种三数组实现HashMap的原理和可能的优势。 1. **基本概念**: - **HashMap**:HashMap是Java集合框架的一部分,它通过哈希函数将键(Key)映射到对应的值(Value),形成键值对。键必须是唯一...
本文研究了基于HashMap的用户标签处理方法,并对Java中HashMap的实现原理进行了深入研究。HashMap是一种高效的数据结构,可以快速地存储和检索数据。本文通过对HashMap的分析,总结了其优缺点,并与其他存储结构进行...
HashMap是Java编程语言中最常用的集合类之一,尤其在面试中,HashMap的相关知识是考察候选人对数据结构和算法理解的重要部分。本套学习资料全面涵盖了HashMap的深入解析,旨在帮助求职者掌握大厂面试中的核心知识点...
K,V> p) { } 这些方法是 HashMap 为 LinkedHashMap 提供的回调接口,用于在插入、访问和删除节点后执行特定的操作。LinkedHashMap 利用这些回调方法来维护其内部链表的顺序。 1. **afterNodeAccess(Node,V> p)**: ...
本文将深入探讨Java集合框架的核心概念,包括List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,帮助你理解和解决面试中的相关问题。 1. **List和Set的区别及应用场景** - **List** 是...
Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解:深入理解...
这份"Java集合思维导图.xmind.zip"压缩包文件,显然旨在帮助学习者深入理解Java集合框架的核心原理以及不同版本间的差异。以下是关于Java集合类,特别是HashMap、CurrentHashMap、ArrayList和LinkedList的详细知识点...
内容概要:本文详细介绍了Java集合框架的重要性和在Android开发中的应用。首先,阐述了集合框架的基本概念,包括接口(Collection、Set、List、Map)和其实现类(ArrayList、LinkedList、HashSet、TreeSet、HashMap...
在这个主题中,我们将深入探讨HashMap类,它是Java集合框架中的一个关键组件,特别是在标题“20-集合框架020-HashMap-1080P 高清-AVC20”和描述中所提到的内容。 HashMap是Java.util包中的一个类,它实现了Map接口...