HashMap 原理
为什么HashMap查找速度是 O(1) ?
- 假如有一个数组a[10],在知道下标 i 的情况下,计算机只要计算 a + i 就能得到 a[i] 的地址,可以直接从存储器中取出数据,时间复杂度为 O(1)
- 如果期望的是数组下标与数据有特殊的关联,即 key-value ,key 不仅仅是 int 型数据,一种可行的解决方法就是对 key 做映射,数组下标 index = hash(key),为解决数据类型和唯一性的问题,应该用 key.hashcode
做映射,这样就能做到接近直接用数组下标查找元素的速度
HashMap 底层数据结构
- 数组 :底层基础结构
- 链表:链地址法解决 hash 冲突
- 红黑树:为提高查找效率,JDK1.8 后引入,但降低了插入、删除速度,当链表长度大于设置的阈值(默认大于8 时),会把链表改成红黑树
基本元素:Entry对象
- private K key;
- private V value;
- private int hash; // key 经过hash函数映射后的地址(数组下标)
- private Entry<K, V> next; // 指向Entry对象的指针
HashMap属性
- private Entry<K, V>[] table; // Entry对象数组
- private int size; // 已存放元素个数
- private int defultLength = 1<<4; // 默认数组长度16
- private static final float DEFAULT_LOAD_FACTOR = 0.75f; // 默认负载因子
- private float loadFactor; // 容量阈值loadFactor = defultLength * DEFAULT_LOAD_FACTOR
扩容机制
- 扩容条件: