HashMap 底层是数组 + 链表 + 红黑树的数据结构,数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组元素叫做 Node,当多个 key 的 hashcode 一致,但 key 值不同时,单个 Node 就会转化成链表,链表的查询复杂度是 O(n),当链表的长度大于等于 8 并且数组的大小超过 64 时,链表就会转化成红黑树,红黑树的查询复杂度是 O(log(n)),简单来说,最坏的查询次数相当于红黑树的最大深度。image.png

底层结构是 数组 + 单向链表 + 红黑树 (jdk8之后),之前是数组 + 链表
底层是,用node节点组成的数组

  1. transient Node<K,V>[] table;

基于对存储数据,数据会被封装成一个Node节点,会存放它的hash值、key值、value值、next指针。

  1. //实现了Entry<K,V>
  2. static class Node<K,V> implements Map.Entry<K,V> {
  3. //这个hash值是通过key的hashcode值经过hash算法得出来的
  4. //做了异或操作
  5. final int hash;
  6. final K key;
  7. V value;
  8. Node<K,V> next;
  9. boolean red;
  10. }

初始容量

初始容量是16

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

默认加载因子是0.75;

static final float DEFAULT_LOAD_FACTOR = 0.75f;