Java1.8之HashMap底层链表变红黑树浅析

2023-11-16

HashMap底层链表变红黑树浅析

全文浏览约10分钟,从一个错误的结论分析到HashMap链表转化为红黑树的原因。读完对HashMap底层会有更深的理解。

广为流传的错误结论

  • 众所周知,Java1.8以后HashMap链表长度大于8数组长度大于64时,链表变为红黑树。

  • 网络上有一种错误说法流传甚广,请看分析:

      - 链表查找的时间复杂度:分为头查找和尾查找,综合两种查找,时间复杂度是n/2
      - 红黑树查找的时间复杂度:log2n
      
      - 分析:当长度为8时,链表查找时间为:8/2 = 4,红黑树查找时间为:log8 = 3
        	 当长度为7时,链表查找时间为:7/2 = 3.5,红黑树查找时间为:log7 = 2.8
      - 结论:长度为8时红黑树明显快于链表
    
  • 以上是错误结论,没有弄清楚大O表示法的意义所在。

大O表示法

  • 大O表示法(时间复杂度):

     大O表示法 是一种特殊的表示法,指出了算法的速度有多快。
     谁在乎呢?实际上,你经常要使用别人编写的算法,在这种情况下,知道这些 算法的速度大有裨益。
    

    简单来说大O表示法用于数据量巨大时所需要的时间消耗。注意!!在数据量过低时,大O表示法没有意义!!!

大O表示法

真正的原因

请看HashMap源码
HashMap源码

  • HashMap源码里的一段注释,大概是说,Hash函数算出HashCode导致冲突的概率符合泊松分布。
  • 个人理解:当链表长度等于8时已经是非常小的小概率事件(0.00000006),而红黑树的维护本就有时间成本,所以为了效率当很不可能出现时(数据量很大时),才转化为红黑树,避免频繁维护红黑树、红黑树变为链表出现的消耗。

本文引用:
Java1.8 Hash、《算法图解》

不忘初心,技术改变世界

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java1.8之HashMap底层链表变红黑树浅析 的相关文章

随机推荐

  • oom killer 详解

    一 oom killer理解和日志分析 知识储备 oom killer日志分析 这是前篇 准备一些基础知识 带着问题看 1 什么是oom killer 是Linux内核设计的一种机制 在内存不足的时候 选择一个占用内存较大的进程并kill掉
  • Navicat使用HTTP通道服务器进行连接mysql数据库(超简单三分钟完成),centos安装nginx和php,docker安装nginx+php合并版

    序言 因为数据库服务器在外网是不能直接连接访问的 但是可以访问网站 网站后台就能访问数据库 所以在此之前 访问数据库的数据是一件非常麻烦的事情 在平时和运维的交流中发现 他们会使用ssh通道进行连接访问数据库 之前并没在意这个东西 直到运维
  • moment函数转换后的时间不正确,带有 “sa“等奇怪的字母

    目录 一 问题 二 解决方法 三 总结 一 问题 1 使用moment函数转换当前日期的格式为 年 月 日 结果转换出来竟然有一些 字母 迷之自信 这不就是这样吗 给了转换格式 给了转换时间 字母就出现这种奇葩的情况 1 代码如下 let
  • 子类化QAbstractTableModel,实现table列排序和整列拖动功能

    子类化QAbstractTableModel 实现table列排序和整列拖动功能 本程序基于Qt5 9 9 Qt creator 4 11 0实现 效果图 1 子类化QAbstractTableModel 主要是实现QAbstractTab
  • 减一天 日期函数_【Excel】日期加减运算法则

    前几天小八和大家分享了如何使用快捷键和函数 快速的输入日期 如果有人不记得了 可以再回顾下 链接如下 Excel 日期木有改 又被领导骂了 除了怎么输入 我想大家更头疼的是 日期怎么参与计算 今天小八就来分享几个日期计算的方法 1 加减1天
  • python实现简易五子棋小游戏(三种方式)

    tkinter库 Python的标准Tk GUI工具包的接口 示例 from tkinter import root Tk 你的ui代码 Label root text hello world pack root mainloop 弹窗结果
  • VS Code集成终端字体修改 & 字体颜色、大小修改方法

    文章目录 VS Code中设置颜色的方法 字体以及字体大小修改 参考 VS Code中设置颜色的方法 通过将以下内容添加到用户设置中 ctrl 并搜索 workbench 然后点击 Edit in settings json 在最后加上如下
  • 国家智慧教育公共服务平台(2023年暑期教师研修)

    前言 最近又要看2023年暑期教师研修高等教育教师专业发展 抓包发现开启倍数无效了 要一个一个点击看视频 岂不是累死人 于是想个办法解放双手 该网站观看视频时 客户端间隔20 50s向服务端发送一个POST请求 服务器每秒返回ts响应 1
  • python数据分析预处理z-score标准化

    一 z score标准化的python代码 import pandas from pandas import read excel from sklearn import preprocessing dataset read excel p
  • 强化学习入门《Easy RL》

    什么是强化学习 强化学习关注的是智能体 Agent 在复杂的环境 Environment 中如何最大化获得的奖励 Reward 智能体和环境两部分组成了强化学习 在强化学习过程中 智能体与环境一直在交互 智能体在环境中获取某个状态后 它会利
  • python学习笔记#2元组和列表

    python学习笔记 2元组和列表 文章目录 python学习笔记 2元组和列表 前言 一 string包含引号 二 复杂数据类型 1 序列 2 tuple 元组 2 list 列表 总结 前言 学习python的复杂数据类型 tuple和
  • 以element ui为例分析前端各种弹窗和对话框的使用场景与区别

    文章目录 摘要 Dialog 对话框 Drawer 抽屉 Notice 通知 MessageBox 弹框 Popconfirm 气泡确认框 Message 消息提示 Notification 通知 Dialog 对话框与Drawer 抽屉的
  • MySQL中的锁机制详解

    概述 事务的隔离性 隔离级别 是由锁来保证的 并发访问数据的情况分为 1 读 读 即并发事务相继读取相同的记录 因为没涉及到数据的更改 所以不会有并发安全问题 允许这种情况发生 2 写 写 即并发事务对相同记录进行修改 会出现脏写问题 因为
  • python flask 网页适应手机端浏览器的编程方法

    1 使用flask在电脑端开发了一个论坛网址 想在手机端浏览看看 却发现根本装不下 并且导航栏元素还消失了 先看电脑端访问是正常的 而手机端导航条不见了 这是因为手机和电脑屏幕分辨率不同导致的 最简单的办法就是添加自适应宽度 并缩放页面 这
  • 异步(延时)逻辑难题,以及采用lua的解决方法

    在网游程序里混过一阵子的程序员大都知道 异步逻辑 是游戏逻辑里最容易失误的地方之一 刷钱 刷经验 不花钱得到道具 然后关服 回档 删号等等等等 其可能造成的危害不胜枚举 而且实际上银行系统之类的地方遇到这种问题就更有趣了 不同团队对此类问题
  • BUUCTF base 第三题Upload-Labs-Linux1比较省事的方法

    1 安装蚁剑 首先下载蚁剑 链接 https pan baidu com s 1O6Ty2Qmk7AVuY9QU CD9gQ fm lk0 提取码 1234 其次解压蚁剑 共两个文件需解压 在AntSword Loader中双击运行 gt
  • PCB线宽与通流量

    PCB通流能力的计算一直缺乏权威的技术方法 公式 经验丰富的Layout工程师依靠个人经验能作出较准确的判断 但是对于Layout新手 不可谓遇上一道难题 PCB的通流能力取决于以下因素 线宽 线厚 铜箔厚度 容许温升 大家都知道 PCB走
  • 基于Redis的Geo实现附近商铺搜索(含源码)

    微信公众号访问地址 基于Redis的Geo实现附近商铺搜索 含源码 推荐文章 1 springBoot对接kafka 批量 并发 异步获取消息 并动态 批量插入库表 2 SpringBoot用线程池ThreadPoolTaskExecuto
  • 复杂网络数据集下载地址

    1 斯坦福大学公开数据集 Stanford Large Network Dataset Collectionhttp snap stanford edu data 2 那慕尔大学公开数据集 Networks konect cc http k
  • Java1.8之HashMap底层链表变红黑树浅析

    HashMap底层链表变红黑树浅析 广为流传的错误结论 大O表示法 真正的原因 全文浏览约10分钟 从一个错误的结论分析到HashMap链表转化为红黑树的原因 读完对HashMap底层会有更深的理解 广为流传的错误结论 众所周知 Java1