hashmap的底层实现原理_hashtable底层数据结构

hashmap的底层实现原理_hashtable底层数据结构一:HashMap底层实现原理解析我们常见的有数据结构有三种结构:1、数组结构2、链表结构3、哈希表结构下面我们来看看各自的数据结构的特点:1、数组结构:存储区间连续、内存占用严重、空间复杂度大优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。2、链表结构:存储区间离散、占用内存宽松、空间复杂度小优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一:HashMap底层实现原理解析

我们常见的有数据结构有三种结构:1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各自的数据结构的特点:
1、数组结构: 存储区间连续、内存占用严重、空间复杂度大

  • 优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)
  • 缺点:插入和删除数据效率低,因插入数据,这个位置后面的数据在内存中都要往后移动,且大小固定不易动态扩展。

2、链表结构:存储区间离散、占用内存宽松、空间复杂度小

  • 优点:插入删除速度快,内存利用率高,没有固定大小,扩展灵活
  • 缺点:不能随机查找,每次都是从第一个开始遍历(查询效率低)

3、哈希表结构:结合数组结构和链表结构的优点,从而实现了查询和修改效率高,插入和删除效率也高的一种数据结构
常见的HashMap就是这样的一种数据结构
在这里插入图片描述

HashMap中的put()和get()的实现原理

  • 1、map.put(k,v)实现原理
    (1)首先将k,v封装到Node对象当中(节点)。
    (2)然后它的底层会调用K的hashCode()方法得出hash值。
    (3)通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。
  • 2、map.get(k)实现原理
    (1)先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。
    (2)通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。如果这个位置上什么都没有,则返回null。如果这个位置上有单向链表,那么它就会拿着K和单向链表上的每一个节点的K进行equals,如果所有equals方法都返回false,则get方法返回null。如果其中一个节点的K和参数K进行equals返回true,那么此时该节点的value就是我们要找的value了,get方法最终返回这个要找的value。

为何随机增删、查询效率都很高的原因是?
原因: 增删是在链表上完成的,而查询只需扫描部分,则效率高。

HashMap集合的key,会先后调用两个方法,hashCode and equals方法,这这两个方法都需要重写。

为什么放在hashMap集合key部分的元素需要重写equals方法?
因为equals方法默认比较的是两个对象的内存地址

二:HashMap红黑树原理分析

相比 jdk1.7 的 HashMap 而言,jdk1.8最重要的就是引入了红黑树的设计,当hash表的单一链表长度超过 8 个的时候,链表结构就会转为红黑树结构。
为什么要这样设计呢?好处就是避免在最极端的情况下链表变得很长很长,在查询的时候,效率会非常慢。
在这里插入图片描述

  • 红黑树查询:其访问性能近似于折半查找,时间复杂度 O(logn);
  • 链表查询:这种情况下,需要遍历全部元素才行,时间复杂度 O(n);

简单的说,红黑树是一种近似平衡的二叉查找树,其主要的优点就是“平衡“,即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度为 log(n)。
在这里插入图片描述
关于红黑树的内容,网上给出的内容非常多,主要有以下几个特性:

  • 1、每个节点要么是红色,要么是黑色,但根节点永远是黑色的;

  • 2、每个红色节点的两个子节点一定都是黑色;

  • 3、红色节点不能连续(也即是,红色节点的孩子和父亲都不能是红色);

  • 4、从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点;

  • 5、所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 NIL 节点);

在树的结构发生改变时(插入或者删除操作),往往会破坏上述条件 3 或条件 4,需要通过调整使得查找树重新满足红黑树的条件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195154.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月22日 下午8:43
下一篇 2025年10月22日 下午9:22


相关推荐

  • Js作用域与作用域链详解

    Js作用域与作用域链详解一直对 Js 的作用域有点迷糊 今天偶然读到 Javascript 权威指南 立马被吸引住了 写的真不错 我看的是第六版本 相当的厚 大概 1000 多页 Js 博大精深 要熟悉精通需要大毅力大功夫 一 函数作用域 nbsp nbsp 先看一小段代码 varscope global functiont console log scope varscope local c

    2026年3月20日
    2
  • 各省DNS列表[通俗易懂]

    各省DNS列表[通俗易懂]各省DNS列表省份/城市DNS名称DNSIPADDRESS==========================================================香港ns1.netvigator.com205.252.144.228澳门vassun2.macau.ctm.net202.175.3.8深圳ns.shenzhen.gd.cn202.96.

    2022年6月11日
    32
  • D-Link 路由 PCAnyWhere 端口映射

    D-Link 路由 PCAnyWhere 端口映射进入首页 设置固定DHCP服务器主机名称 IP地址(192.168.0.100)  MAC地址进入进阶设定  虚拟服务器建立新的虚拟服务器列表以下三项需建立并激活VirtualServerHTTP 192.168.0.100TCP80/80pcanywhere     192.168.0.100TCP5631/5631pcanywhere     192

    2025年11月9日
    6
  • 解决pycharm license activation

    解决pycharm license activation解决 pycharmlicen

    2026年3月20日
    3
  • 23 种设计模式详解(全23种)

    23 种设计模式详解(全23种)设计模式的分类总体来说设计模式分为三大类 创建型模式 共五种 工厂方法模式 抽象工厂模式 单例模式 建造者模式 原型模式 结构型模式 共七种 适配器模式 装饰器模式 代理模式 外观模式 桥接模式 组合模式 享元模式 行为型模式 共十一种 策略模式 模板方法模式 观察者模式 迭代子模式 责任链模式 命令模式 备忘录模式 状态模式 访问者模式 中介者模式 解释器模式 A 创建

    2026年3月20日
    2
  • java让关键词自动加超链接,ASP实现关键词自动添加超链接代码与使用方法

    java让关键词自动加超链接,ASP实现关键词自动添加超链接代码与使用方法网站内链模块是 SEO 常提到的一个优化模块 给关键词锚文本添加超链接 如果手动添加 既不好维护也浪费人力 下面青岛星网跟大家分享 ASP 实现关键词自动添加超链接代码与使用方法 ASP 关键词自动替换函数代码如下 functionkey replace byvalcontent byvalasp byvalhtm dimMatches objRegExp strs istrs contentSe

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号