目录
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;
}
}
大致的数据结构如下图(是不是很像一个表格):

本文详细介绍了HashMap的数据结构,包括数组加链表的存储方式以及JDK1.8后引入的红黑树结构。此外,还给出了自定义HashMap的实现,包括构造函数、put、get和remove等关键方法,以及查找和删除操作的逻辑。在实现过程中,注意到了键计算后的hash值可能超出默认容量导致下标越界的问题。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



