java集合系列之hashmap详细介绍(源码解析)和使用示例

上传人:第*** 文档编号:61906957 上传时间:2018-12-14 格式:DOC 页数:42 大小:196.50KB
返回 下载 相关 举报
java集合系列之hashmap详细介绍(源码解析)和使用示例_第1页
第1页 / 共42页
java集合系列之hashmap详细介绍(源码解析)和使用示例_第2页
第2页 / 共42页
java集合系列之hashmap详细介绍(源码解析)和使用示例_第3页
第3页 / 共42页
java集合系列之hashmap详细介绍(源码解析)和使用示例_第4页
第4页 / 共42页
java集合系列之hashmap详细介绍(源码解析)和使用示例_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《java集合系列之hashmap详细介绍(源码解析)和使用示例》由会员分享,可在线阅读,更多相关《java集合系列之hashmap详细介绍(源码解析)和使用示例(42页珍藏版)》请在金锄头文库上搜索。

1、Java 集合系列之 HashMap详细介绍(源码解析)和使用示例概要这一章,我们对HashMap进行学习。我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap。内容包括:第1部分 HashMap介绍第2部分 HashMap数据结构第3部分 HashMap源码解析(基于JDK1.6.0_45) 第3.1部分 HashMap的“拉链法”相关内容 第3.2部分 HashMap的构造函数 第3.3部分 HashMap的主要对外接口 第3.4部分 HashMap实现的Cloneable接口 第3.5部分 HashMap实现的Serializable接口第4部分

2、 HashMap遍历方式第5部分 HashMap示例第1部分 HashMap介绍HashMap简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。加载因子 是哈希表在

3、其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。 HashMap的构造函

4、数HashMap共有4个构造函数,如下:复制代码/ 默认构造函数。HashMap()/ 指定“容量大小”的构造函数HashMap(int capacity)/ 指定“容量大小”和“加载因子”的构造函数HashMap(int capacity, float loadFactor)/ 包含“子Map”的构造函数HashMap(Map map)复制代码 HashMap的API复制代码void clear()Object clone()boolean containsKey(Object key)boolean containsValue(Object value)SetEntry entrySet(

5、)V get(Object key)boolean isEmpty()Set keySet()V put(K key, V value)void putAll(Map map)V remove(Object key)int size()Collection values()复制代码 第2部分 HashMap数据结构HashMap的继承关系复制代码java.lang.Object java.util.AbstractMap java.util.HashMappublic class HashMap extends AbstractMap implements Map, Cloneable, Se

6、rializable 复制代码从图中可以看出: (01) HashMap继承于AbstractMap类,实现了Map接口。Map是key-value键值对接口,AbstractMap实现了键值对的通用函数接口。 (02) HashMap是通过拉链法实现的哈希表。它包括几个重要的成员变量:table, size, threshold, loadFactor, modCount。table是一个Entry数组类型,而Entry实际上就是一个单向链表。哈希表的key-value键值对都是存储在Entry数组中的。 size是HashMap的大小,它是HashMap保存的键值对的数量。 thresho

7、ld是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值=容量*加载因子,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。loadFactor就是加载因子。 modCount是用来实现fail-fast机制的。 第3部分 HashMap源码解析(基于JDK1.6.0_45)为了更了解HashMap的原理,下面对HashMap源码代码作出分析。在阅读源码时,建议参考后面的说明来建立对HashMap的整体认识,这样更容易理解HashMap。复制代码 1 package java.util; 2 import java.

8、io.*; 3 4 public class HashMap 5 extends AbstractMap 6 implements Map, Cloneable, Serializable 7 8 9 / 默认的初始容量是16,必须是2的幂。 10 static final int DEFAULT_INITIAL_CAPACITY = 16; 11 12 / 最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换) 13 static final int MAXIMUM_CAPACITY = 1 30; 14 15 / 默认加载因子 16 static final float D

9、EFAULT_LOAD_FACTOR = 0.75f; 17 18 / 存储数据的Entry数组,长度是2的幂。 19 / HashMap是采用拉链法实现的,每一个Entry本质上是一个单向链表 20 transient Entry table; 21 22 / HashMap的大小,它是HashMap保存的键值对的数量 23 transient int size; 24 25 / HashMap的阈值,用于判断是否需要调整HashMap的容量(threshold = 容量*加载因子) 26 int threshold; 27 28 / 加载因子实际大小 29 final float load

10、Factor; 30 31 / HashMap被改变的次数 32 transient volatile int modCount; 33 34 / 指定“容量大小”和“加载因子”的构造函数 35 public HashMap(int initialCapacity, float loadFactor) 36 if (initialCapacity MAXIMUM_CAPACITY) 41 initialCapacity = MAXIMUM_CAPACITY; 42 if (loadFactor = 0 | Float.isNaN(loadFactor) 43 throw new Illegal

11、ArgumentException(Illegal load factor: + 44 loadFactor); 45 46 / 找出“大于initialCapacity”的最小的2的幂 47 int capacity = 1; 48 while (capacity initialCapacity) 49 capacity = 1; 50 51 / 设置“加载因子” 52 this.loadFactor = loadFactor; 53 / 设置“HashMap阈值”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。 54 threshold = (

12、int)(capacity * loadFactor); 55 / 创建Entry数组,用来保存数据 56 table = new Entrycapacity; 57 init(); 58 59 60 61 / 指定“容量大小”的构造函数 62 public HashMap(int initialCapacity) 63 this(initialCapacity, DEFAULT_LOAD_FACTOR); 64 65 66 / 默认构造函数。 67 public HashMap() 68 / 设置“加载因子” 69 this.loadFactor = DEFAULT_LOAD_FACTOR; 70 / 设置“HashMap阈值”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。 71

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号