参考文章:什么是HashMap?、图解集合4:HashMap
接下来通过 jdk 1.8 进行分析
HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。
特点:
1. HashMap的key和value都允许null值,当key相同时, 值会覆盖,即key是唯一的。
2. HashMap是无序的,存值时是根据key的hashcode进行映射,因而存入顺序在数组中的实际顺序会被打乱。
3. 线程不安全
构造器
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// 只选取了两个较常用的构造器
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
loadFactor指加载因子,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,通过调用 resize方法将容量翻倍。
可见默认的加载因子为0.75,即HashMap中元素个数超出总大小的75%时,容量将扩大。
数组实体
/**
* The table, initialized on first use, and resized as
* necessary. When allocated, length is always a power of two.
* (We also tolerate length zero in some operations to allow
* bootstrapping mechanics that are currently not needed.)
*/
transient Node<K,V>[] table;
注释:数组实体,第一次使用时初始化,必要时进行扩容,当分配容量时,数组大小始终为2的幂。
数组元素数据结构
static class Node<K,V> implements Map.Entry<K,V> {