首页 > 其他分享 >hashmap底层原理

hashmap底层原理

时间:2022-11-29 12:35:51浏览次数:39  
标签:扩容 HashMap 链表 数组 红黑树 原理 底层 resize hashmap

1 HashMap的内部数据结构

数组 + 链表/红黑树

 

2 HashMap允许空键空值么

HashMap最多只允许一个键为Null(多条会覆盖),但允许多个值为Null

 

3 影响HashMap性能的重要参数

初始容量:创建哈希表(数组)时桶的数量,默认为 16 负载因子:哈希表在其容量自动增加之前可以达到多满的一种尺度,默认为 0.75

 

4 HashMap的工作原理

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象

 

5 HashMap为什么要引入红黑树

引入红黑树数据结构是为了解决链表O(n)的时间复杂度,由于链表不支持索引,要想在链表中找一个元素就需要遍历一遍链表,那显然效率是比较低的。达到一定条件时(链表长度8),链表就会转变红黑树。


6 扩容

数组容量是有限的,如果数据多次插入并到达一定的数量就会进行数组扩容,也就是resize 方法。如果当前存入的数据数量大于 Capacity * LoadFactor 的时候,就会进行数组扩容 resize。就比如当前的 HashMap 的最大容量大小为 100,当你存进第 76 个的时候,判断发现需要进行 resize了,那就进行扩容。

1)Capacity:HashMap 当前最大容量/长度

2)LoadFactor:负载因子,默认值0.75f

扩容 resize 分为两步

1)扩容:创建一个新的 Entry/Node 空数组,长度是原数组的 2 倍

2)ReHash:遍历原 Entry/Node 数组,把所有的 Entry/Node 节点重新 Hash 到新数组

 

标签:扩容,HashMap,链表,数组,红黑树,原理,底层,resize,hashmap
From: https://www.cnblogs.com/ningshare/p/16935080.html

相关文章

  • 宠物饮水机缺水检测原理
    宠物饮水机越来越智能化,从开始的预留窗口人工查看水位,到目前的传感器自动侦测水位变化并发出提醒。每一个新增的功能都能给用户带来不一样的体验。电容式水位传感器:很多宠物......
  • vue3响应式原理以及ref和reactive区别还有vue2/3生命周期的对比,第二天
    前言:前天我们学了ref和reactive,提到了响应式数据和Proxy,那我们今天就来了解一下,vue3的响应式在了解之前,先复习一下之前vue2的响应式原理vue2的响应式:原理:对......
  • KVC原理与数据筛选
    作者:宋宏帅1前言在技术论坛中看到一则很有意思的KVC案例:@interfacePerson:NSObject@property(nonatomic,copy)NSString*name;@property(nonatomic,assign)......
  • mybatis SelectKey标签执行原理
    SelectKey标签在mybatis中可以配置成在主sql执行之前和执行之后两种时机进行执行。mybatis执行sql时一次会涉及到这些对象sqlSession-->Executor-->StatementHandler其......
  • 软件离线许可(License)实现原理
    我们经常使用各种开发软件,比如IntelliJIDEA、Navicat、VisualStudio等,这些软件都有一个特点,就是要收费。一般是我们需要去购买一个许可,然后输入这个许可到软件里就能够......
  • 图解Linux进程间通信实现原理(1)
    为Linux应用程序的开发人员,对Linux的进程间通信方式肯定是了如指掌,平时的开发中应该会大量的使用到。当你迅速的在键盘上按下【CTRL+C】终止掉一个正在运行中的命令时,你有没......
  • 大数据下一代变革之必研究数据湖技术Hudi原理实战双管齐下-下
    @目录集成Spark开发Spark编程读写示例DeltaStreamer集成Flink环境准备sql-clent使用启动插入数据流式读取Bucket索引HudiCatalog集成Spark开发Spark编程读写示例通过ID......
  • 「ReactNative」原理剖析
    「ReactNative」原理剖析不太帅的程序员前端程序员、搬砖coding、持续分享优质文章! 28人赞同了该文章​展开目录 一、......
  • 操作系统原理之线程的分类:用户级线程和内核级线程
    本篇文章作为Java并发编程的前置重点知识,有助于理解乐观锁和悲观锁。 这个世界上只有两种锁-->乐观锁:指的是在操作数据的时候非常乐观,乐观地认为别人不会同时修改数据,......
  • Cross-Origin Resource Sharing(CORS)详解,CORS详解,CORS原理分析
    Cross-OriginResourceSharing(CORS)详解,CORS详解,CORS原理分析Cross-OriginResourceSharing通常简称为:CORS它是一种机制,这个机制使用了一个额外的HTTP响应头来赋予当前us......