目录
HashMap介绍
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap采取数组加链表的存储方式来实现,数组里的每个元素都是单向链表( Entry(key, value, next) ),
我们都知道数组查询效率高,但是增删效率低,而链表增删效率高,而查询效率低;也正是因为这一特性,HashMap采用的是数组加链表的结构;
不过,数组结构存储区间连续,占用内存情况较为严重,而链表结构存储区间较为离散,占有内存比较宽松;所以在JDK1.8之后,HashMap引入了红黑树的结构,当链表长度超过一定值(默认为8)时,则会将链表结构进行调整转变为红黑树结构;当红黑树中的元素数量小于8个时,则又会将结构体进行转变为链表结构;
HashMap的默认初始容量为16,即在创建一个HashMap时,HashMap首先创建一个长度为16的空数组,当我们插入数据时,会根据插入的Key进行hash计算,得出当前数据应该存储在数组的链表位置下标。
官方的hash函数运算代码:
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
简单一点讲,HashMap就是一个Entry数组,
private Entry<K, V>[] table;
每一个Entry包含一个key-value键值对(Entry就是HashMap里实现的一个静态内部类,里面定义了key、value等属性)
static class Entry<K, V> implements Map.Entry<K,V> {
private final long hash;
private final K key;
private V value;
Entry<K,V> next;
Entry(long hash, K key, V value, Entry<K, V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
}
大致的数据结构如下图