HashMap 底层是数组 + 链表 + 红黑树的数据结构,数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组元素叫做 Node,当多个 key 的 hashcode 一致,但 key 值不同时,单个 Node 就会转化成链表,链表的查询复杂度是 O(n),当链表的长度大于等于 8 并且数组的大小超过 64 时,链表就会转化成红黑树,红黑树的查询复杂度是 O(log(n)),简单来说,最坏的查询次数相当于红黑树的最大深度。
底层结构是 数组 + 单向链表 + 红黑树 (jdk8之后),之前是数组 + 链表
底层是,用node节点组成的数组
transient Node<K,V>[] table;
基于对存储数据,数据会被封装成一个Node节点,会存放它的hash值、key值、value值、next指针。
//实现了Entry<K,V>
static class Node<K,V> implements Map.Entry<K,V> {
//这个hash值是通过key的hashcode值经过hash算法得出来的
//做了异或操作
final int hash;
final K key;
V value;
Node<K,V> next;
boolean red;
}
初始容量
初始容量是16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
默认加载因子是0.75;
static final float DEFAULT_LOAD_FACTOR = 0.75f;