《HashMap的数据结构》

这篇具有很好参考价值的文章主要介绍了《HashMap的数据结构》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

HashMap概述:

 数据结构的组成:

一个键值对是如何存入该结构中:

HashMap中链表和红黑树的用途和转换方式 :


 

HashMap概述:

        《HashMap的数据结构》

         HashMap是基于哈希表的Map接口实现的,它存储的内容是键值对<key,value>映射。

该类无序。

 数据结构的组成:

        在JDK1.7及以前,HashMap的数据结构是有数组+单向链表组成的。(在链表中插入元素采用头插法)

        在JDK1.8之后,HashMap的数据结构是有数组+单向链表+红黑树组成的。(在链表中插入元素采用尾插法)

        HashMap内部数据结构使用数组+链表+红黑树进行存储的。数组的类型为Node[ ],每个Node都保存了某个KV键值对元素的key、value、hash、next等值。如图:

                                《HashMap的数据结构》

 每个Node对象都是单向链表的组成节点。

        《HashMap的数据结构》

         在HashMap中存在加载因子(填充因子)默认为0.75。

        代表HashMap对数组容量的使用率为75%,超过该使用率则数组就会扩容。

        加载因子决定了HashMap对数组的使用率,加载因子越高,表示填满的元素就越多,集合的空间利用率就越高,但是冲突的机会就会增加。反之,越小则冲突越少,但是空间利用率就越低,浪费了很多空间。

 《HashMap的数据结构》

 当

         一个键值对是如何存入该结构中:

                当添加一个KV键值对元素时,通过该元素的key的hash值,计算出该元素在数组中的下标。如果该下标位置已经有其他Node对象,则采用链地址法处理,即将新添加的KV键值对元素以链表的形式存储。将新元素封装成一个新的Node对象,插入到该下标位置的链表尾部。当链表的长度超过8并且数组的长度超过64时,为了避免查找搜索的性能下降,该链表会转成一个红黑树。

         当添加第一个KV键值对时,如果数组为空,则默认扩容为16。

        加入元素时,如果链表长度大于阈值(默认为8)并且数组长度小于64时,会产生数组扩容。

        添加元素后,当HashMap中的元素个数超过【数组大小×加载因子】时,原数组扩容2倍。

         在JDK1.7及之前计算下标时,采用hash%数组长度

        在JDK1.8之后,采用(数组长度-1)& hash。(提高了性能,数组的长度必须为2的N次幂)

HashMap中链表和红黑树的用途和转换方式 :

        HashMap采用数组+单向链表+红黑树组成。

        数组的特点:查询快,插入删除慢。

        链表的特点:查询慢,插入删除快。

        看一个实例:

                ​​​​​​​《HashMap的数据结构》

                 有以上长度为9的数组,现在要存储key="张三"这样一个数据,假设他的hash值为423。用(数组长度-1)& hash计算下标 得0,将key存放在下标为0处。

        通过这样的方法也随之会产生一个问题——哈希冲突。因为数组的大小有限,我们计算的下标始终在一定范围内。这样我们难免会产生一样的索引,但是同一个位置又不能存放2个不同的key,所以就产生了哈希冲突。这样的话,链表的用处就来了,当发现数组上的位置被占用了,我们可以将key链接在该位置后。

        我们都知道链表的查询速度很慢,所以当链表上的数据过多时就会导致查询速度变慢。当链表的长度大于等于8并且数组长度大于64时,会将链表转换为红黑树,加快查询速度。当长度小于8时又会变成链表结构。文章来源地址https://www.toymoban.com/news/detail-466293.html

到了这里,关于《HashMap的数据结构》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【java数据结构】HashMap和HashSet

    目录 一.认识哈希表: 1.1什么是哈希表? 1.2哈希表的表示:  1.3常见哈希函数:  二.认识HashMap和HashSet: 2.1关于Map.Entry的说明:, 2.2Map常用方法说明: 2.3HashMap的使用案例: 2.4Set常见方法说明:  2.5HashSet使用案例: 源码: 之前的学习中,如果我们要查找一个元素,肯定是要经

    2024年03月14日
    浏览(83)
  • 【Java 数据结构】HashMap和HashSet

    目录 1、认识 HashMap 和 HashSet 2、哈希表 2.1 什么是哈希表 2.2 哈希冲突 2.2.1 概念 2.2.2 设计合理哈希函数 - 避免冲突 2.2.3 调节负载因子 - 避免冲突 2.2.4 Java中解决哈希冲突 - 开散列/哈希桶 3、HashMap 的部分源码解读 3.1 HashMap 的构造方法 3.2 HashMap 是如何插入元素的? 3.3 哈希表

    2024年02月01日
    浏览(43)
  • java八股文面试[数据结构]——HashMap扩容优化

         知识来源: 【2023年面试】HashMap在扩容上做了哪些优化_哔哩哔哩_bilibili  

    2024年02月11日
    浏览(39)
  • Java-数据结构(二)-Map:HashMap、TreeMap、LinkedHashMap

        Map是Java中常用的数据结构,它提供了一种键值对的存储方式,可以根据键来快速访问值。在本篇文章中,我将学习Java中的Map数据结构     问题是最好的老师,我将从至少以下几个方面阐述,什么是map、使用Map有什么好处、Map的底层原理、map中的key和value分别是

    2024年02月06日
    浏览(39)
  • java数据结构(哈希表—HashMap)含LeetCode例题讲解

      目录 1、HashMap的基本方法 1.1、基础方法(增删改查) 1.2、其他方法  2、HashMap的相关例题 2.1、题目介绍 2.2、解题 2.2.1、解题思路 2.2.2、解题图解 2.3、解题代码 HashMap 是一个散列表,它存储的内容是键值(key-value)映射。 HashMap 的 key 与 value 类型可以相同也可以不同,根据定

    2024年02月05日
    浏览(52)
  • 源码分析——HashMap(JDK1.8)源码+底层数据结构分析

    HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈

    2024年02月13日
    浏览(43)
  • [JDK8下的HashMap类应用及源码分析] 数据结构、哈希碰撞、链表变红黑树

    [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析 [Java基础] 数组应用及源码分析 [Java基础] String,分析内存地址,源码 [JDK8环境下的HashMap类应用及源码分析] 第一篇 空构造函数初始化 [JDK8环境下的HashMap类应用及源码分析] 第二篇 看源码了解HashMap的扩容机制 [JDK8环境下的

    2024年02月10日
    浏览(43)
  • 【数据结构】【王道】【数据结构实现】文章目录

    持续更新中。。。 数据结构 链接 顺序表实现及基本操作(可直接运行) 文章链接 无头结点单链表的实现及基本操作(可直接运行) 文章链接 带头结点单链表的实现及基本操作(可直接运行) 文章链接 双链表的实现及基本操作(可直接运行) 文章链接 循环链表的实现及

    2023年04月08日
    浏览(90)
  • 数据结构和算法概述

    官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 大白话: 数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据 传统上,我们可以把数据结构分为逻辑结构和物理结构两大类

    2024年02月08日
    浏览(34)
  • 数据结构与算法:概述

    目录 算法 评价标准 时间的复杂度 概念 推导原则 举例 空间的复杂度 定义 情形 运用场景 数据结构 组成方式 在数学领域,算法是解决某一类问题的公式和思想; 计算机科学领域,是指一系列程序指令,用于解决特定的运算和逻辑问题; 衡量算法好坏的重要标准是:时间复

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包