HashMap 原理(数据结构)

简介: 基于数组、链表与红黑树的组合结构,HashMap通过key的hashCode定位数组索引实现O(1)存取。因数组容量有限,难免发生哈希冲突,此时用链表串联冲突元素。但链表过长会降低性能,故当链表长度≥8且数组容量≥64时,转为红黑树以提升查找效率至O(log n),避免性能退化;反之删除节点过多则退化回链表。

底层数据结构:数组+链表+红黑树

接下来的回答中要点出数组的作用,为啥会有冲突,如何解决冲突

  • 数组:存取元素时,利用 key 的 hashCode 来计算它在数组中的索引,这样在没有冲突的情况下,能让存取时间复杂度达到 O(1)
  • 冲突:数组大小毕竟有限,就算元素的 hashCode 唯一,数组大小是 n 的情况下要放入 n+1 个元素,根据鸽巢原理,肯定会发生冲突
  • 解决冲突:一种办法就是利用链表,将这些冲突的元素链起来,当然在在此链表中存取元素,时间复杂度会提高为 O(n)

接下来要能说出为什么在链表的基础上还要有红黑树

  • 树化目的是避免链表过长引起的整个 HashMap 性能下降,红黑树的时间复杂度是 O(log{n})

有一些细节问题可以继续回答,比如树化的时机【进阶】

  • 时机:在数组容量达到 >= 64 且 链表长度 >= 8 时,链表会转换成红黑树
  • 如果树中节点做了删除,节点少到已经没必要维护树,那么红黑树也会退化为链表
相关文章
|
存储 SQL NoSQL
HarmonyOS学习路之开发篇—数据管理(分布式数据服务)
分布式数据服务(Distributed Data Service,DDS) 为应用程序提供不同设备间数据库数据分布式的能力。通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合帐号、应用和数据库三元组,分布式数据服务对属于不同应用的数据进行隔离,保证不同应用之间的数据不能通过分布式数据服务互相访问。在通过可信认证的设备间,分布式数据服务支持应用数据相互同步,为用户提供在多种终端设备上最终一致的数据访问体验。
|
Linux C语言
Linux These critical programs are missing or too old: compiler
Linux These critical programs are missing or too old: compiler
3641 0
Linux These critical programs are missing or too old: compiler
|
9月前
|
Java C++
对比 synchronized 和 Lock
synchronized 是Java关键字,基于C++实现,使用简便;Lock 是Java接口,功能更强大,支持公平锁、超时、可中断等特性,且有多种扩展实现。但需手动调用unlock释放锁,而synchronized在代码块结束自动释放。
|
Java iOS开发 MacOS
8 种 Java- 内存溢出之四 -Metaspace
8 种 Java- 内存溢出之四 -Metaspace
|
存储 监控 Java
线上OOM排查
本文介绍了JDK工具的使用方法及其应用场景。首先详细说明了`jps`、`jstack`、`jstat`和`jmap`等工具的基本用法及参数含义,帮助开发者实时监控Java进程的状态,诊断线程问题及内存使用情况。接着介绍了`jvisualvm.exe`和`MemoryAnalyzer.exe`两款内存诊断工具,展示了如何通过这些工具进行内存分析。最后,文章提供了在线上OOM故障排查的具体步骤,并给出了解决方案示例,以便开发者更好地理解和解决实际问题。
1699 2
线上OOM排查
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
910 2
|
数据处理 索引 Python
Pandas中的filter函数:有点鸡肋
Pandas中的filter函数:有点鸡肋
629 1
自适应模型预测控制器AMPC的simulink建模与仿真
通过Simulink内嵌Matlab实现自适应MPC控制器,结合系统模型与控制对象完成仿真。面对日益复杂的工业过程,AMPC融合MPC与自适应控制优势,依据系统变化自动调节参数,确保优化控制及鲁棒性。MPC通过预测模型优化控制序列;自适应控制则动态调整控制器以应对不确定性。AMPC适用于多变环境下高性能控制需求,如化工、航空及智能交通系统。[使用MATLAB 2022a]

热门文章

最新文章