文章目录
HashMap
1、基本概念
两个概念:
初始容量(桶) 负载因子
当哈希表中的条目数 > ( 负载因子 * 当前容量 ) 时,哈希表将进行扩容,以便哈希表拥有大约两倍的桶数
初始桶数:16
初始负载因子:0.75
与Hashtable的区别:HashMap是非线程安全的,Hashtable是线程不安全的
2、看代码
2.1 类信息
继承一个抽象类,三个接口
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
}
Cloneable接口:实现clone方法来进行深浅克隆
Serializable接口:对象序列化接口
什么时候需要用到序列化?
需要把对象的状态进行网络传输 or 对象信息持久化
private static final long
serialVersionUID = 362498820763181265L;
该参数就是设置字节流的UID来进行序列化动作
2.2 类属性
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 初始容量
static final int MAXIMUM_CAPACITY = 1 << 30; // 最大容量,1 * 2 的30次方
static final float DEFAULT_LOAD_FACTOR = 0.75f; // 初始负载因子
static final int TREEIFY_THRESHOLD = 8; // 桶中链表个数超过8时转换为红黑树
static final int UNTREEIFY_THRESHOLD = 6; // 桶中链表个数小于6时转换为链表
static final int MIN_TREEIFY_CAPACITY = 64;
// 桶后链表被树化时,最小的hash表容量
// 散列表容量小于64时,就算桶后数量超过8,也不会树化,只会扩容
// transient 属性不会被序列化
transient Node<K,V>[] table; // 保存桶元素的数组
transient Set<Map.Entry<K,V>> entrySet; // 返回键值对数据
transient int size; // 集合中元素个数
transient int modCount; // 当前结构被修改的次数,配合快速失败机制
int threshold; // 记录桶中链表的数量
final float loadFactor;
// 负载因子,用来衡量hashmap 满的程度,影响扩容时机,默认值为0.75
// 实时计算负载因子的公式:size / capacity,集合元素个数 除以 当前容量
2.3 内部类Node及其内部方法
static