花 5 分钟手写一个简单的 HashMap,搞定挑剔面试官

本文介绍了如何在面试中快速手写一个简单的HashMap,包括Map接口定义、成员变量、构造方法、put、get和remove方法。文章强调了避免哈希冲突和减少链表长度对提高HashMap效率的重要性,并提到了HashMap的扩容和树化问题,适合加深对HashMap原理的理解。
摘要由CSDN通过智能技术生成

前言

今天去面试啊,聊得差不多的时候面试官突然问我会手写 HashMap 吗?这我哪能怂啊,好死不死的面试之前我还真手写过一个简单的 HashMap,所以我不过花了 5 分钟便弄出来了,面试官直呼内行。

相信大家关于 HashMap 的面试题刷的也不少了,源码应该也看了很多遍,大部分人可以说是非常熟悉了,但是如果面试官突然给你们整这么一手,我相信很多人还是会表示懵逼的。所以今天给大伙捋一捋,掌握手写 HashMap 之后都给我去手撕面试官。

除了 hashmap 之外我还整理了很多经典面试题,做成了一本 PDF,内容不多,但全是干货,需要的朋友可以点击这里领取>>互联网公司Java面试核心知识

HashMap 是 Java 中一中非常常用的数据结构,也基本是面试中的“必考题”。它实现了基于“K-V”形式的键值对的高效存取。JDK1.7 之前,HashMap 是基于数组+链表实现的,1.8 以后,HashMap 的底层实现中加入了红黑树用于提升查找效率。

HashMap 根据存入的键值对中的 key 计算对应的 index,也就是它在数组中的存储位置。当发生哈希冲突时,即不同的 key 计算出了相同的 index,HashMap 就会在对应位置生成链表。当链表的长度超过 8 时,链表就会转化为红黑树。

手写 HashMap 之前,我们讨论一个小问题:当我们在 HashMap 中根据 key 查找 value 时,在数组、链表、红黑树三种情况下,平均要做多少次比较?

在数组中查找时,我们可以通过 key 的 hashcode 直接计算它在数组中的位置,比较次数为 1

在链表中查找时,根据 next 引用依次比较各个节点的 key,长度为 n 的链表节点平均比较次数为 n/2

在红黑树中查找时,由于红黑树的特性,节点数为 n 的红黑树平均比较次数为 log(n)

前面我们提到,链表长度超过 8 时树化(TREEIFY),正是因为 n=8,就是 log(n) < n/2 的阈值。而 n<6 时,log(n) > n/2,红黑树解除树化(UNTREEIFY)。另外我们可以看到,想要提高 HashMap 的效率,最重要的就是尽量避免生成链表,或者说尽量减少链表的长度,避免哈希冲突,降低 key 的比较次数。

手写 HashMap

定义一个 Map 接口

也可以使用 Java 中的java.util.Map

public interface MyMap<K,V> {
  
    V put(K k, V v);
    V get(K k);
    int size();
    V remove(K k);
    boole
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值