线性表数据结构解读(五)哈希表结构-HashMap

本文介绍了哈希表作为数据结构的优势,它是查找和插入操作的理想选择。通过哈希函数将关键码映射到表中位置,提高访问速度。文章详细分析了HashMap的继承关系、元素定义、构造方法、put方法、get方法和remove方法,揭示了其内部工作原理,包括拉链法的使用和扩容机制。
摘要由CSDN通过智能技术生成

    前面的博客中,我给大家分析过数组和链表两种线性表数据结构。数组存储区间连续,查找方便,但是插入和删除效率低下;链表存储区间离散,插入删除方便,但是查找困难。大家肯定会问,有没有一种结构,既能做到查找便捷,又能做到插入删除方便呢?答案就是我们今天要跟大家说的主角:哈希表。
    我们先来看一下哈希表的百度定义

散列表(Hash table,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash)函数。

下图是一个经典的哈希表实现方式图,来自百度百科。

这里写图片描述

再看一张图

这里写图片描述

    这张图更明显的告诉我们哈希表采用的是一种“拉链法”实现的,关于拉链法,大家可以自行百度脑补。左边是数组,右边是链表,感觉十分像用数组把链表串起来,在一个长度为16的数组中,每个元素存储的是一个链表的头结点。接下来我们一起来分析一下HashMap的源码实现。

HashMap的继承关系

这里写图片描述

通过HashMap的继承关系,我们可以得知HashMap继承自抽象类AbstractMap,该Map又实现了Map接口,我们下来看一下Map接口包含哪些方法。

这里写图片描述

可以看出包含了我们常用的HashMap中的一些方法,接着我们来看HashMap的父类AbstractMap。

public abstract class AbstractMap<K, V> implements Map<K, V> {
   
    // 用懒加载的方式定义了Set集合类型的键,表明HashMap键是不能重复的
    Set<K> keySet;

    // 用懒加载的方式定义了Collection集合类型的值,表明HashMap值是可以重复的
    Collection<V> valuesCollection;
    ……
}

这里重点要看明白一开始定义的键和值,键是不能重复的,值可以重复。
然后定义了两个静态的实体类

// 维护键和值的 Entry
static class AbstractMap.SimpleEntry<K,V>  
// 维护不可变的键和值的 Entry
static class AbstractMap.SimpleImmutableEntry<K,V>           

继续下面实现了接口Map中的方法:clear、put、get、equals、size、hashCode等等。

HashMap源码解析

现在我们开始分析HashMap的源码,走起┏ (゜ω゜)=☞

元素定义

    private static final int MINIMUM_CAPACITY = 4;// HashMap最小容量为4

    private static final 
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值