`
xifangyuhui
  • 浏览: 189046 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入Java集合学习系列:HashMap的实现原理(2)

阅读更多

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作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...

    深入Java集合学习系列

    文件"深入Java集合学习系列:HashMap的实现原理 - 莫等闲 - ITeye技术网站.mht"将详细解析HashMap的内部节点结构、扩容机制以及处理哈希冲突的方法。 接下来,ArrayList是一个动态数组,它继承自AbstractList并实现...

    java软件技术文档-深入java8的集合3:HashMap的实现原理.pdf

    HashMap 是 Java 中最常用的集合类之一,它是基于哈希表数据结构实现的,提供快速的存取操作。在深入理解 HashMap 的实现原理之前,我们先要明白哈希表的基本概念。哈希表是一种通过哈希函数将键(Key)映射到数组...

    尚硅谷-深入java8的集合3:HashMap的实现原理.pdf

    ·基于JDK 11,将Java8、Java9、Java10、Java11新特性一网打尽 ·课程中,Eclipse和IDEA这两种企业一线开发环境都使用到了 3.技术讲解更深入、更全面: ·课程共30天,715个知识视频小节,涉及主流Java使用的...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合...

    源码解析jdk7.0集合(3):HashMap的底层实现原理.pdf

    HashMap是Java集合框架中Map接口的典型实现之一,主要用于存储键值对(Key-Value)数据。其特性如下: - 线程不安全,方法为非同步方法,因此多线程环境下访问可能会出现并发问题。 - 允许使用null作为键(Key)和...

    java集合PDF汇总

    首先,我们来看"深入Java集合学习系列(一):HashMap的实现原理_尚硅谷_张晓飞.pdf"。HashMap是Java中常用的键值对存储容器,它的主要特点是查找速度快,平均时间复杂度为O(1)。HashMap内部使用了哈希表的数据结构,...

    java软件技术文档-深入java8的集合5:Hashtable的实现原理.pdf

    【Java软件技术文档-深入Java8的集合5:Hashtable的实现原理】 在Java编程语言中,集合框架是不可或缺的一部分,而Hashtable是其中一种古老的、线程安全的哈希表实现。尽管现在更多地使用HashMap或...

    学习笔记:三数组实现的HashMap

    这里我们将深入探讨这种三数组实现HashMap的原理和可能的优势。 1. **基本概念**: - **HashMap**:HashMap是Java集合框架的一部分,它通过哈希函数将键(Key)映射到对应的值(Value),形成键值对。键必须是唯一...

    基于HashMap的用户标签处理兼Java中HashMap实现原理研究.pdf

    本文研究了基于HashMap的用户标签处理方法,并对Java中HashMap的实现原理进行了深入研究。HashMap是一种高效的数据结构,可以快速地存储和检索数据。本文通过对HashMap的分析,总结了其优缺点,并与其他存储结构进行...

    深入解读大厂java面试必考点之HashMap全套学习资料

    HashMap是Java编程语言中最常用的集合类之一,尤其在面试中,HashMap的相关知识是考察候选人对数据结构和算法理解的重要部分。本套学习资料全面涵盖了HashMap的深入解析,旨在帮助求职者掌握大厂面试中的核心知识点...

    java软件技术文档-深入java8的集合4:LinkedHashMap的实现原理.pdf

    K,V&gt; p) { } 这些方法是 HashMap 为 LinkedHashMap 提供的回调接口,用于在插入、访问和删除节点后执行特定的操作。LinkedHashMap 利用这些回调方法来维护其内部链表的顺序。 1. **afterNodeAccess(Node,V&gt; p)**: ...

    深入探索Java集合框架:解密复杂的面试题和精准解析

    本文将深入探讨Java集合框架的核心概念,包括List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,帮助你理解和解决面试中的相关问题。 1. **List和Set的区别及应用场景** - **List** 是...

    Java工程师面试复习指南

    Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解:深入理解...

    Java集合思维导图.xmind.zip

    这份"Java集合思维导图.xmind.zip"压缩包文件,显然旨在帮助学习者深入理解Java集合框架的核心原理以及不同版本间的差异。以下是关于Java集合类,特别是HashMap、CurrentHashMap、ArrayList和LinkedList的详细知识点...

    Java Android开发:深入解析Java集合框架及其应用场景

    内容概要:本文详细介绍了Java集合框架的重要性和在Android开发中的应用。首先,阐述了集合框架的基本概念,包括接口(Collection、Set、List、Map)和其实现类(ArrayList、LinkedList、HashSet、TreeSet、HashMap...

    20-集合框架020-HashMap-1080P 高清-AVC20

    在这个主题中,我们将深入探讨HashMap类,它是Java集合框架中的一个关键组件,特别是在标题“20-集合框架020-HashMap-1080P 高清-AVC20”和描述中所提到的内容。 HashMap是Java.util包中的一个类,它实现了Map接口...

Global site tag (gtag.js) - Google Analytics