一、原型及简介

  原型:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

  简介:HashMap基于散列表实现的一个key-value数据结构,能够实现通过key值快速查找。HashMap继承自AbstractMap抽闲类,实现了Map接口。

 二、数据结构原理介绍

  如下图所示,HashMap是利用数组与链表结合的形式构建的。竖列为数组结构,默认初始数量为16(1<<4)个,横列为链表结构用于解决散列冲突的问题。当数组中有值得元素超过了装载因子的比例(默认为0.75)时,会引发扩容的操作。此操作是为了避免元素过满时引起的链表长度过长,从而影响查找性能。

  JAVA数据结构——Map之HashMap

上图为jdk1.7之前的实现,jdk1.8实现方法是当某一个桶中的元素个数超过了8时,将此桶中的链表构建成红黑树。

三、常用源码解析

  1、常量说明

 1     /**
 2      * 默认初始容量
 3      */
 4     static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
 5 
 6     /**
 7      * 最大元素数量
 8      */
 9     static final int MAXIMUM_CAPACITY = 1 << 30;
10 
11     /**
12      * 默认装载因子
13      */
14     static final float DEFAULT_LOAD_FACTOR = 0.75f;
15 
16     /**
17      * 当一个桶中的元素的数量大于8时,该链表结构可能被转化成一棵红黑树,优化查找
18      */
19     static final int TREEIFY_THRESHOLD = 8;
20 
21     /**
22      * 当一个桶中的元素的数量小于6时,该树结构被转化成链表。
23      */
24     static final int UNTREEIFY_THRESHOLD = 6;
25 
26     /**
27      * 桶被树化的另一个条件是,当hashmap中元素个数大于4 * MIN_TREEIFY_CAPACITY 。避免调整大小和treei阈值之间的冲突。
28      */
29     static final int MIN_TREEIFY_CAPACITY = 64;
常量值说明

相关文章: