用数组加链表实现一个Simple版的HashMap(暂未实现自动扩容)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

HashMap介绍

开始实现


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;
        }
}

大致的数据结构如下图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值