JDK常用的数据类型【1】 ——HashMap(分享篇)

这篇具有很好参考价值的文章主要介绍了JDK常用的数据类型【1】 ——HashMap(分享篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JDK常用的数据类型【1】 ——HashMap(分享篇)

x mod 2^n = x & (2^n - 1)

1. 拿到 key 的 hashCode 值
2. 将 hashCode 的高位参与运算,重新计算 hash 值
3. 将计算出来的 hash 值与 (table.length - 1) 进行 & 运算

数据结构

1.B树 和 B+树

  • B树叶子节点可以存放多个元素
  • B+树的叶子节点之间是有指针的

红黑树

  1. (1) 每个节点或者是黑色,或者是红色。
  2. (2) 根节点是黑色。
  3. (3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!]
  4. (4) 如果一个节点是红色的,则它的子节点必须是黑色的。
  5. (5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

HashMap 的底层是个 Node 数组(Node<K,V>[]
table),在数组的具体索引位置,如果存在多个节点,则可能是以链表或红黑树的形式存在。

增加、删除、查找键值对时,定位到哈希桶数组的位置是很关键的一步,源码中是通过下面3个操作来完成这一步:

  • 1)拿到 key 的 hashCode 值;
  • 2)将 hashCode 的高位参与运算,重新计算 hash 值;
  • 3)将计算出来的
    hash 值与 “table.length - 1” 进行 & 运算。
  • HashMap 的默认初始容量(capacity)是 16,capacity 必须为 2 的幂次方;默认负载因子(load factor)是 0.75;实际能存放的节点个数(threshold,即触发扩容的阈值)= capacity * load factor。

HashMap 在触发扩容后,阈值会变为原来的 2 倍,并且会对所有节点进行重 hash 分布,重 hash
分布后节点的新分布位置只可能有两个:“原索引位置” 或 “原索引+oldCap位置”。例如 capacity 为16,索引位置 5
的节点扩容后,只可能分布在新表 “索引位置5” 和 “索引位置21(5+16)”。

导致 HashMap 扩容后,同一个索引位置的节点重 hash 最多分布在两个位置的根本原因是:
1)table的长度始终为 2 的 n 次方;
2)索引位置的计算方法为 “(table.length - 1) & hash”。HashMap 扩容是一个比较耗时的操作,定义HashMap 时尽量给个接近的初始容量值。文章来源地址https://www.toymoban.com/news/detail-489322.html

  • HashMap 有 threshold 属性和 loadFactor 属性,但是没有 capacity 属性。初始化时,如果传了初始化容量值,该值是存在 threshold 变量,并且 Node 数组是在第一次 put
    时才会进行初始化,初始化时会将此时的 threshold 值作为新表的 capacity 值,然后用 capacity 和loadFactor 计算新表的真正 threshold 值。
  • 当同一个索引位置的节点在增加后达到 9 个时,并且此时数组的长度大于等于 64,则会触发链表节点(Node)转红黑树节点(TreeNode),转成红黑树节点后,其实链表的结构还存在,通过 next属性维持。链表节点转红黑树节点的具体方法为源码中的 treeifyBin方法。而如果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容。
  • 当同一个索引位置的节点在移除后达到 6 个时,并且该索引位置的节点为红黑树节点,会触发红黑树节点转链表节点。红黑树节点转链表节点的具体方法为源码中的 untreeify 方法。
  • HashMap 在 JDK 1.8 之后不再有死循环的问题,JDK 1.8 之前存在死循环的根本原因是在扩容后同一索引位置的节点顺序会反掉。
  • HashMap 是非线程安全的,在并发场景下使用 ConcurrentHashMap 来代替。

到了这里,关于JDK常用的数据类型【1】 ——HashMap(分享篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • [JDK8环境下的HashMap类应用及源码分析] 看源码了解HashMap的扩容机制

    🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄、CSDN博客专家 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析 [Java基础] 数组应用及源码分析 [Java基础] String,分析

    2024年02月10日
    浏览(50)
  • jdk1.7与jdk1.8的HashMap区别2-底层原理区别

    jdk1.7与jdk1.8的HashMap区别1-基本结构与属性对比_ycsdn10的博客-CSDN博客 1.代码数:JDK1.7与JDK1.8相差了一倍的代码 2.方法数:JDK1.7是40个,JDK1.8是51个(只算基本方法)  进行了4次位运算,5次亦或运算  进行了1次位运算,1次亦或运算 由上一章知道,JDK1.7是数组+链表,JDK1.8是数组

    2024年02月13日
    浏览(42)
  • 【Java】JDK1.8 HashMap源码,put源码详细讲解

       📝个人主页:哈__ 期待您的关注  在Java中,HashMap结构是被经常使用的,在面试当中也是经常会被问到的。这篇文章我给大家分享一下我对于HashMap结构源码的理解。 HashMap的存储与一般的数组不同,HashMap的每一个元素存储的并不是一个值,而是一个引用类型的Node结点,这

    2024年04月13日
    浏览(46)
  • 蓝桥杯拿到一等奖,并分享经验

    昨天和群里的小伙伴在群里聊,有的小伙伴竟然说蓝桥杯一等奖没有含量,我也是醉了! 就像去年看了一个号主写的:研究生遍地都是! 放眼全国14亿人口,别说研究生了,本科生占比有多少? “蓝桥杯是我人生中得到的第一个大奖,在蓝桥杯大赛备赛期间,我学到了很多知识

    2024年02月05日
    浏览(52)
  • 下载的Jenkins只支持jdk11,但是项目是用的jdk1.8,怎么配置多个jdk

    我的Jenkins用的是2.375,支持java-11-openjdk,不支持java-1.8.0-openjdk。在按照官网安装jenkins Jenkins能够正常启动。 现在项目要用jdk1.8,所以为了方便在jenkins中新添加jdk,我在服务器上使用 安装open-1.8.0-openjdk,重启Jenkins,结果报错: 同时,使用命令 显示Jenkins启动使用了java-1.8.0-

    2024年02月02日
    浏览(55)
  • List<Long> 类型数据转为string字符串类型 jdk1.8新特性

    话不多说,直接上代码 这里,我们首先将 ListLong 转换为 StreamLong ,然后使用 map() 方法将每个 Long 类型的元素转换为字符串类型,再使用 Collectors.joining() 方法将所有字符串连接起来并用逗号和空格分隔。 需要注意的是, Collectors.joining() 方法返回的是一个字符串类型的结果,

    2024年02月13日
    浏览(54)
  • HashMap 的常用方法

    HashMap 是 Java 中使用最广泛的集合类之一,它是一种非常快速的键值对存储方式,可以用于存储和访问大量的数据。下面介绍一些 HashMap 的常用方法: 一、HashMap 的常用方法 1、Map.replaceAll() Map.replaceAll() 方法将所有的值转为 String 类型 结果: {key1=123, key2=true, key3=Wed May 10 10:1

    2024年02月03日
    浏览(30)
  • Redis常用数据类型及常用命令

    服务端运行 配置文件需要输入完整地址 连接数据库 设置数据库密码 编辑 redis.windows.conf 文件 带端口密码地址连接数据库 利用可视化工具连接redis 连接前需启动服务端 地址: https://gitee.com/qishibo/AnotherRedisDesktopManager/releases 字符串操作命令 哈希操作命令 列表操作命令 集合操

    2024年02月11日
    浏览(65)
  • HashMap原理详解及常用API介绍

    如果你准备面试Java后端方向的工程师,那么HashMap可以说是面试中的重中之重,你去10家公司面试,可能8家公司都会会问道。所以可见HashMap相关的知识点对于我们面试来说有多么重要,接下来就让我们走进HashMap的大门吧! HashMap是Java当中一种数据结构,是一个用于存储Key-V

    2024年02月16日
    浏览(36)
  • PostgreSQL(五)常用数据类型

    数据类型 别名 说明 character(n) char(n) 定长字符串,不足补空格 character varying(n) varchar(n) 变长字符串 text 变长字符串 数据类型 别名 说明 范围 smallint int2 有符号2字节整数 :-32768 到 +32767 integer int 、 int4 有符号4字节整数 :-2147483648 到 +2147483647 bigint int8 有符号8字节整数 :-922337203

    2024年02月06日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包