hashmap修改对应key的值_HashMap结构走析一遍

本文深入解析HashMap的内部结构,包括散列表原理、哈希函数、冲突解决(链地址法)、扩容机制以及JDK1.8后的红黑树优化。通过理解HashMap的工作方式,有助于提高日常编码效率和面试准备。
摘要由CSDN通过智能技术生成

HashMap是我们日常编码中使用频率非常高的一个数据结构,也几乎是面试中必问的一个点,现在咱们对HashMap的结构来一次简单的走析。

public class HashMap   extends AbstractMap  implements Map, Cloneable, Serializable {}

可以看到HashMap实现了Map接口。HashMap对Map接口的实现基于散列表(hash table),所以在开始,咱们先看一下什么是散列表。

散列表

散列表是一种数据结构,我们可以把散列表看做一种特殊使用方式的数组,之所以特殊,是因为一般使用数组存放的元素E与数组的下标INDEX之间并没有特定的关系,而在散列表中元素E会与INDEX通过一个函数建立一种映射关系,当这个函数确定后,元素E在数组中的位置也随之确定。这个函数我们称它为哈希函数。哈希函数的实现不是固定的,可以根据实际情况进行设计编码。

哈希表的大小可以根据自己的需求进行设定,也就是修改这个特殊数组的长度,数据元素的存放只要根据哈希函数进行映射到相应的位置,用法比较容易,也比较灵活。但在使用的过程中,可能会产生“冲突”,举个列子,比如我们创建一个容积为10的数组Array[10],设定一个哈希函数F(x)=x%10,有9与19两个值,根据哈希函数映射,两个值都会映射到Array[9]的位置。要解决这“冲突”,最常见的方法是链地址法,创建一个元素为链表初始值为空的数组,当有“冲突”发生时,产生冲突的元素将成为对应数组元素地址中链表元素的下一个值,逻辑如下简图,HashMap采用的就是这种实现(在JDK1.8之后有升级实现,后面会有提及)。

8b74b0d96769dbb16b84036022d7a005.png

左侧0-5是数组空间

通过上面打的描述我们来完善一下散列表的说明:散列表是一种以数组为基础,通过哈希函数进行存放位置寻找并通过合理方法进行冲突处理并确定最终处理位置后

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值