HashMap底层数据结构

TreeMap

TreeMap的底层是红黑树,是自平衡的二叉查找树。

在查找元素时会从左子树或右子树查找,和元素一个一个进行比较,对于大数量的查找的场景TreeMap不适合(HashMap解决了这个问题)。

TreeMap的好处,是一个天然有序集合,适用于对元素进行排序的场景。

HashMap

HashMap原理

HashMap是Map接口的实现类。

HashMap解决大数量查找的问题。

HashMap也叫哈希表,底层:
在这里插入图片描述
如何向HashMap中添加一个元素:

  1. 计算这个元素(key)的哈希值。
  2. 根据哈希值找到数组中桶的位置。
  3. 如果桶中没有元素,直接将新元素存入桶中。
  4. 如果桶中有元素,根据equals方法来判断是否和已有元素相等,如果相等则覆盖,如果不相等就存入链表或红黑树。

哈希值

在Object类中有一个方法得到哈希值。
public native int hashCode();
native: 本地方法,用c语言实现的。

默认哈希值:

  1. 整数的哈希值是它本身。
  2. 字符串的哈希值是根据各个字符计算出来的。
  3. 任意对象的哈希值是它的内存地址。

哈希值的特点:
1、 同一对象多次调用它的hashCode()方法得到哈希值是相同的。
2、默认情况下对象的哈希值是不同的。

自定义类型时可以重写hashCode()方法,根据业务需求自定义哈希值的计算过程。

哈希表的原理

根据源代码分析向哈希表存入元素的过程。

public V put (K key, V value){
	return putVal(hash(key), key, value, false, true);
}

// 第一个参数hash(key)计算哈希值
putVal(hash(key), key, value, false, true);

  1. 如果table为空,调用resize()方法,调整table的长度。
  2. 得到新表的长度,赋值给变量n。
  3. 如果桶中没有元素,直接将新元素放入桶中。
  4. (n-1)&hash计算桶位置。
  5. 如果要添加的新元素和桶中的元素相等(使用equals方法),直接覆盖。
  6. 如果节点是TreeNode红黑树,将新元素存入红黑树。否则将新元素存入链表。

在这里插入图片描述

哈希表扩容

  1. 首先根据哈希表的长度计算一个阈值,阈值=hash表的长度*负载因子(0.75)
    16 * 0.75 = 12
  2. 当每次添加完元素,判断集合中的元素个数是否达到阈值,如果达到了,开始扩容。每次扩容原来大小的二倍。
  3. 扩容不仅是创建新数组,还需要将旧数组中的数据拷贝到新数组中。

哈希冲突

向哈希表添加一个元素,计算桶的位置,当位置上有元素了,叫哈希冲突,也叫哈希碰撞。

哈希冲突影响了存储的效率。

如何避免哈希冲突?

(n - 1)& hash 计算桶的位置

包括两个因素:n表示表的长度; hash表示key的哈希值。

  1. 避免哈希冲突要保证对象的哈希值不同。

通常要对自定义类型的hashCode()进行重写。

建议使用idea或Eclipse生成:

@Overrride
public int hashCode(){
	return Objects.hash(id, nickName, age);
}
  1. 哈希表的容量使用2的n次幂,默认情况下哈希表的初始容量是16、经过扩容后是32、64···

测试代码

通过测试debug跟踪,HashMap (哈希表的扩容以及链表转成红黑树)。

参考资料:快速搞定Java HashMap底层原理_攀博课堂分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/6068.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

隐私计算 FATE - 多分类神经网络算法测试

一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练,并使用该模型对数据进行 多分类预测。 二分类算法:是指待预测的 label 标签的取值只有两种;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…

两个数组的交集(力扣刷题)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/intersection-of-two-arrays 说…

人大女王金融硕士——站在一个更高的起点,拓宽自己的眼界

俗话说:“视野所及,心之所止”。做任何事情,最重要的是眼光。眼界不一样,就会有不一样的人生。站得更高才能看得更远,看得更远才能收获更多。人民大学与加拿大女王大学金融硕士项目为我们提供在职读研平台,…

Python机器学习:最大熵模型

信息论里,熵是可以度量随机变量的不确定性的,已经证明的:当随机变量呈均匀分布的时候,熵值最大,一个有序的系统有着较小的熵值,无序系统的熵值则较大。 机器学习里面,最大熵原理假设&#xff1…

【HAL库】HAL库STM32cubemx快速使用

文章目录整体框图一、基础工程1 新建工程2 配置RCC3 配置SYS4 工程设置5 生成代码6 keil设置下载&复位二、必备外设1 目录规范2 LED2 RTC3 USART4 KEY三、其他外设1 OLED(模拟IIC、模拟SPI)2 BH1750光强检测3 MQ2烟雾检测3 MQ4甲醛检测4 DHT11温湿度…

基于蓄电池进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳座右铭&#…

第04章_运算符

第04章_运算符 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公…

该不该放弃嵌入式,单片机这条路?

本文几乎浓缩了我从业10几年的精华,内容涵盖我转行、打工、创业的经历。 建议从头到尾不要错过一字一句,因为字里行间的经验之谈,或许能成为你人生重要转折点。 全文3700多字,写了6个多小时,如果你赶时间,建…

【17】核心易中期刊推荐——深度学习 | 遥感图像处理

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

【学会这几个VSCode插件,让你的Python代码更优秀】

VSCode(Visual Studio Code)是由微软研发的一款免费、开源的跨平台文本(代码)编辑器,一般主要用于轻量级的编程代码工作,就非常适合Python,同时在前端开发方面也有举足轻重的地位。但如果想用于…

蓝桥杯集训·每日一题Week3

Trie AcWing 835. Trie字符串统计(算法基础课) 思路: Trie是一种高效地存储和查找字符串集合的数据结构,适用于字符串不太复杂的情况。其形状是一个以0为根节点的树,查询和插入的效率都比较高,有插入和查询两种操作。…

制造业的寒冬真的要来了吗?

制造业的寒冬真的要来了吗?其实当前,我国制造业发展水平是处于全球第三阵列,排名第四的: 但能处第三序列靠前,还是因为“规模发展”起了重要支撑——依靠规模拉动发展。所以如果从“质量效益”、“结构优化”、“持续发…

【AI探索】我问了ChatGPT几个终极问题

终于尝试了一把ChatGPT的强大之处,问了一下关心的几个问题: chatGPT现在在思考吗?有没有什么你感兴趣的问题? 你认为AI会对人类产生哪些方面的影响? 你对人类所涉及到的学科有了解吗?你认为在哪些方面与人类…

JetPack Compose之Modifier修饰符

前言 在Compose中,每一个组件都是带有Compose注解的函数,被称为Composable。Compose已经预置了很多的Compose UI组件,这些组件都是基于Material Design规范设计的,例如Button,TextField,TopAPPBar等。在布…

IOC、AOP、和javca面试题

一、 1、控制反转(IOC) 将创建管理对象的工作交给容器来做。在容器初始化(或在某个时间节点)通过反射机制创建好对象,在使用时直接从容器中获取。 控制反转:将对象的控制权反过来交给容器管理。 IOC实现…

既然有http 请求,为什么还要用rpc调用?

先弄明白什么是RPC。 RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之…

【面试】Java并发编程面试题

文章目录基础知识为什么要使用并发编程多线程应用场景并发编程有什么缺点并发编程三个必要因素是什么?在 Java 程序中怎么保证多线程的运行安全?并行和并发有什么区别?什么是多线程多线程的好处多线程的劣势:线程和进程区别什么是…

基于java+ssm+vue病人跟踪治疗信息管理系统的搭建及源码

源码获取方式见文末 一.需求简介 病人治疗信息管理系统采用B/S模式,实现安全、快捷、高效的病人跟踪治疗信息管理。传统手工管理模式效率低下,已无法满足病人需求。 信息化时代的到来,使得开发病人跟踪治疗信息管理系统成为必然。 本系统采…

Linux 串口RS232/485/GPS 驱动实验(移植minicom)

目录Linux 下UART 驱动框架I.MX6U UART 驱动分析硬件原理图分析RS232 驱动编写移植minicomRS232 驱动测试RS232 连接设置minicom 设置RS232 收发测试RS485 测试RS485 连接设置RS485 收发测试GPS 测试GPS 连接设置GPS 数据接收测试串口是很常用的一个外设,在Linux 下…

python入门(一)conda的使用,创建修改删除虚拟环境,以及常用命令,配置镜像

文章目录背景1.conda的下载地址:2.安装3.执行常用命令1)查看版本2)查看所有虚拟环境3)创建虚拟环境4)激活虚拟环境5)关闭虚拟环境6)删除虚拟环境7)创建python2.7的虚拟环境8)使用pyt…