Java集合(十)继承Map接口的HashMap

一、HashMap简介(基于JDK1.8)

HashMap是基于哈希表(散列表),实现Map接口的双列集合,数据结构是“链表散列”,也就是数组+链表 ,key唯一的value可以重复,允许存储null 键null 值,元素无序。JDK1.8对HashMap进行一个大的优化,底层数据结构有“数组+链表”的形式,变成“数组+链表+红黑树”的形式,当链表长度超过阈值时,将链表转换为红黑树,这样大大减少了查找时间。

HashMap 的实例有两个参数影响其性能:“初始容量” 和 “负载因子”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

通常,默认负载因子是 0.75F, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

(一)、HashMap与Map接口的关系

(二)、数据结构

JDK 1.8 的 HashMap 的数据结构如下图所示,当链表节点较少时仍然是以链表存在,当链表节点较多时(大于8)会转为红黑树。

二、HashMap的继承结构

从HashMap继承结构和HashMap与Map接口关系图,可以看出:

HashMap继承于AbstractMap类,实现了Map接口。Map是"key-value键值对"接口,AbstractMap实现了"键值对"的通用函数接口。

HashMap是通过"拉链法(链地址法)"实现的哈希表。

HashMap实现了Cloneable接口,即实现了clone()方法。clone()方法的作用很简单,就是克隆一个HashMap对象并返回。

HashMap实现Serializable接口,分别实现了串行读取、写入功能。

串行写入函数是writeObject(),它的作用是将HashMap的“总的容量,实际容量,所有的Entry”都写入到输出流中。

而串行读取函数是readObject(),它的作用是将HashMap的“总的容量,实际容量,所有的Entry”依次读出。

三、HashMap的构造方法

四、HashMap重要成员属性

(一)、table

是一个Node[]数组类型,Node实现了Map.Entry接口,是链表的节点。哈希表的"key-value键值对"都是存储在Node数组中的。

(二)、size

是HashMap的大小,它是HashMap保存的键值对的数量。

(三)、threshold

是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值="容量 * 负载因子",当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。

(四)、loadFactor

负载因子。当HashMap达到阈值时,负载因子 * 容量将HashMap扩容。

(五)、modCount

记录HashMap修改的次数,主要用来是用来实现fail-fast机制的。

五、HashMap的遍历

(一)、通过entrySet方法遍历HashMap的键值对

1、通过entrySet()方法获取HashMap“键值对”集合Set;

2、通过Iterator迭代器遍历获取的HashMap的“键值对”集合Set。

1 Set> set =map.entrySet();2 Iterator iterator =set.iterator();3 while(iterator.hasNext()) {4 Object obj =iterator.next();5 }

View Code

(二)、通过keySet方法遍历HashMap的键

1、通过keySet()方法获取HashMap“键”的Set集合;

2、通过Iterator迭代器遍历获取的HashMap的“键”集合Set。

1 Set> set =map.keySet();2 Iterator iterator =set.iterator();3 while(iterator.hasNext()) {4 Object obj =iterator.next();5 }

View Code

(三)、通过value方法遍历HashMap的值

1、通过value()方法获取HashMap“值”的Set集合;

2、通过Iterator迭代器遍历获取的HashMap的“值”集合Set。

1 Collection coll =map.values();2 Iterator iterator =coll.iterator();3 while(iterator.hasNext()) {4 Object obj =iterator.next();5 }

View Code

六、HashMap常用API

七、总结

1、HashMap 的底层是个 Node 数组(Node[] table),在数组的具体索引位置,如果存在多个节点,则可能是以链表或红黑树的形式存在。

2、HashMap 的默认初始容量(capacity)是 16,capacity 必须为 2 的幂次方;默认负载因子(load factor)是 0.75;实际能存放的节点个数(threshold,即触发扩容的阈值)= capacity * load factor。

3、HashMap 有 threshold 属性和 loadFactor 属性,但是没有 capacity 属性。初始化时,如果传了初始化容量值,该值是存在 threshold 变量,并且 Node 数组是在第一次 put 时才会进行初始化,初始化时会将此时的 threshold 值作为新表的 capacity 值,然后用 capacity 和 loadFactor 计算新表的真正 threshold 值。

4、当同一个索引位置的节点在增加后达到 9 个时,并且此时数组的长度大于等于 64,则会触发链表节点(Node)转红黑树节点(TreeNode),转成红黑树节点后,其实链表的结构还存在,通过 next 属性维持。链表节点转红黑树节点的具体方法为源码中的 treeifyBin 方法。而如果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容。

5、当同一个索引位置的节点在移除后达到 6 个时,并且该索引位置的节点为红黑树节点,会触发红黑树节点转链表节点。红黑树节点转链表节点的具体方法为源码中的 untreeify 方法。

6、HashMap 是非线程安全的,在并发场景下使用 ConcurrentHashMap 来代替。

java 实现hashmap_Java集合(十)实现Map接口的HashMap相关推荐

  1. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  2. Map接口、HashMap、LinkedHashMap

    Map接口.HashMap.LinkedHashMap 1. 概述 Map接口和Collection接口是完全不同的,Collection<E>接口是单列集合,就一个泛型:Map<K ...

  3. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  4. Java集合查找Map,Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  5. Java集合篇:Map接口、Map接口的实现类、Collections集合工具类

    目录 一.Map接口 1.1 Map接口概述 1.2 Map接口常用功能 二.Map接口的实现类 2.1 Map实现类之一:HashMap 2.1.1 HashMap概述 2.1.2 HashMap的 ...

  6. Java基础学习——Java集合(九)Map接口、HashMap、LinkedHashMap实现类、TreeMap实现类

    一.Map接口 二.HashMap实现类.LinkedHashMap实现类 1.HashMap的特点 1)无序,唯一(key唯一,因为底层key按照哈希表(数组+链表)的结构) 2)放入集合的数据的类 ...

  7. JAVA基础-06.集合-15.【Map】

    01_Map集合遍历键找值方式 02_Map集合遍历键值对方式 03_练习_计算一个字符串中每个字符出现次数 04_斗地主案例需求分析 day04 [Map] 主要内容 Map集合 教学目标 能够说出 ...

  8. Java学习关于集合框架的基础接口--Collection接口

     集合框架(Collection  Framework)是Java最强大的子系统之一,位于java.util 包中.集合框架是一个复杂的接口与和类层次,提供了管理对象组的最新技术.Java集合框架标准 ...

  9. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

最新文章

  1. 目标检测 - YOLO9000 : Better, Faster, Stronger
  2. 【转】如何在忘记CentOS的root密码的情况下修改root密码。
  3. boost::math::barycentric_rational相关用法的测试程序
  4. sqlserver启用登陆审计
  5. Linux系统下安装Mysql数据库
  6. bzoj2616:SPOJ PERIODNI
  7. MS CRM 2011汇总更新5发布
  8. Spring Boot内嵌Tomcat原理
  9. Web GIS多种方式发布动态地图服务及显示(1)
  10. html中字体 楷体_HTML+CSS入门 CSS设置中文字体(font-family:黑体)后样式失效问题如何解决...
  11. 纹理特征提取(envi+python)
  12. 面试珠玑 嵌入式C程序员经典笔试题一
  13. Python Tox 使用笔记
  14. c# 检测中英输入法_用C#控制当前输入法
  15. 【软件测试项目】三角形路径测试
  16. c++ 鼠标切换形状
  17. 甘草干姜汤治疗肺虚寒
  18. 【Python技能】如丝滑般控制键盘鼠标
  19. 阿里云 Redis 报出You can't read against a non-read redis.解决方案
  20. mvc mysql连接字符串_mvc与sql连接数据库

热门文章

  1. 「建模调参」之零基础入门数据挖掘
  2. 用什么tricks能让模型训练得更快?先了解下这个问题的第一性原理
  3. CVPR 2022 接收结果出炉!录用 2067 篇,接收数量上升24%(附最新论文速递)
  4. 任天堂经典游戏可以体感操作了,打开网页就能玩,击败泰森不是梦
  5. 老师吴恩达,身家又增20亿
  6. 字节跳动《Python高频面试题》火了,完整版 PDF 开放下载!
  7. 在PyTorch中进行双线性采样:原理和代码详解
  8. 漫画:生活很苦!当你扛不下去想放弃时,一定要过来看看!
  9. 盘点当下大热的 7 大 Github 机器学习『创新』项目
  10. Python设计模式-状态模式