面试再也不怕被问 HashMap 了

本文详细探讨HashMap的内部数据结构、工作原理、冲突解决策略以及1.8版本的优化。HashMap采用数组+链表/红黑树实现,允许空键,初始容量为16,负载因子为0.75。1.8中优化包括采用尾插法、调整扩容策略及引入红黑树,以提高性能。在多线程环境下,HashMap可能导致数据不一致或死循环问题,适用于非并发场景。
摘要由CSDN通过智能技术生成

我们都知道,要查找一个元素,如果是顺序查找,那么时间复杂度会达到O(n) ,比如:顺序表。也有可能达到 O(logn),如:平衡树。那么要想更快,我们就可以考虑另外一种数据结构,它可以达到时间复杂度为 O(1)。如:HashMap。

什么是HashMap?

HashMap 是一个 key-value模型,具有映射关系,通过 key值可以找到 value值。并允许使用 null值和 null键,HashMap 不保证映射的顺序。

一.HashMap基本知识

1.哈希冲突的定义
如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈希运算,得到一个存储地址后,然后要进行插入的时候,发现该位置已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。由此可见哈希函数的设计至关重要,好的哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(当发生冲突时,继续寻找下一块未被占用的存储地址,然后再放入元素即可),再散列函数法,链地址法,而 HashMap 即是采用了链地址法,也就是数组+链表的方式。

2.hashmap的实现原理
HashMap 的主干是一个 Entry 数组。Entry 是 HashMap 的基本组成单元,每一个 Entry 包含一个 key-value 键值对。
HashMap的总体结构如下:
在这里插入图片描述
简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值