Java HashMap 简介

news2024/10/5 23:30:32

HashMap 简介

  • HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是线程不安全的。 HashMap;
  • 可以存储 null 的 key 和 value ,但 null 作为 key 只能有一个,null 作为值可以有多个;
  • JDk 1.8 之前 HashMap 底层是由数组+链表实现的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(拉链法解决冲突)。JDK 1.8 及之后的 HashMap 在解决哈希冲突时使用了红黑树,当链表长度大于等于阈值(默认为8)并且数组长度超过64时(未超过64会先将数组扩容),将链表转化为红黑树,以减少所搜时间;
  • HashMap 默认的初始大小为16,负载因子为0.75,数组使用超过 16 * 0.75 =12 后就将进行扩容,每次扩充容量变为原来的2倍。并且,HashMap 总是使用2的幂作为哈希表的大小;
    在这里插入图片描述

为什么使用红黑树

  • 在使用红黑树之前,即使哈希函数取值再好,也很难达到元素完全均匀分布,当 HashMap 中有大量的元素都存放在一个数组节点时,这个节点下就有一条长链表,这时候 HashMap 就相当于一个单链表,查找的时间复杂度为O(n),失去了其优势;
  • 针对这种情况,JDK 1.8 中引入了红黑树(红黑树的查找时间复杂度为:O(logn) )来优化这个问题,当链表长度很小的时候,即使遍历,速度也很快;

为什么单链表长度超过8时才转为红黑树结构

  • 因为树节点所占空间是普通节点的两倍,所以只有当节点足够多的时候,才会使用树节点。
    在这里插入图片描述
  • 源码上说,为了配合使用分布良好的 hashCode ,树节点很少使用;
  • 在理想情况下,受随机分布的 hashCode 影响,链表中的节点遵守泊松分布,而且根据统计,链表节点数是8的概率已经非常小了,只有在这种比较罕见和极端的情况下,才会把链表转变为红黑树;
  • 链表转化为红黑树也是需要消耗性能的;

为什么 HashMap 线程不安全

  • 非同步操作:HashMap 的实现不是线程安全的,它没有内部机制来处理多个线程同时访问或修改 HashMap 的情况。如果多个线程对 HashMap 进行插入、删除或更新操作,可能会导致数据的不一致或损坏;
  • 容量扩容:HashMap 在扩容时,需要重新计算元素的哈希值并重新分配存储位置,这个过程涉及到对原数组进行复制和重新插入元素的操作。如果在扩容期间有其他线程对 HashMap 进行并发修改,就可能导致数据丢失或出现异常;
  • 非原子操作:HashMap 的操作不是原子性的,例如 put() 方法涉及到了多个步骤,包括计算哈希值、查找和插入元素等。如果多个线程同时执行这些操作,就有可能导致数据不一致的情况

解决方法:

  • 使用同步机制:可以使用线程安全的 Map 实现,如 ConcurrentHashMap ,或者通过在访问 HashMap 时使用 synchronized 或其他锁机制来确保同一时间只有一个线程能够修改 HashMap;
  • 使用线程封闭:可以将 HashMap 封闭在单个线程中,通过使用 ThreadLocal 或将 HashMap 作为局部变量在每个线程中进行操作,从而避免多线程访问导致线程安全问题;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中,我们介绍了大语言模型与人类对齐的“3H原则”,以及基于人类反馈的强化学习方法(RLHF),本文将继续介绍另外一种非强化学习的对齐方法:直接偏好优化&am…

深度学习语义分割算法之基础知识

文章目录 前言一、图像分割介绍1.语义分割2.实例分割3.全景分割 二、常见数据集格式1.PASCAL VOC2.MS COCO 三、语义分割结果四、语义分割常见评价指标1.Pixel Accuracy2.mean Accuracy3.mean IoU 五、语义分割标注工具结束语 💂 个人主页:风间琉璃🤟 版…

FireFox 编译指南2024 Windows10篇-环境准备(一)

1. 引言 在开源浏览器项目中,Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox,开发者需要做好充分的环境准备工作。这不仅是编译成功的基础,也是后续调试、优化和二次开发的关键步骤。 编译Firefox是一个复…

硬核实力再亮,玩出梦想科技发布全球首款安卓系统空间计算机

6月25日,玩出梦想科技在新加坡召开全球新品发布会,正式发布全球首款安卓系统空间计算机——玩出梦想MR,填补了空间计算机在安卓生态的空白。 作为品牌沉淀两年的破晓之作,玩出梦想MR以业内领先软硬件配置,强大自研算法…

kafka--发布-订阅消息系统

1. Kafka概述 1. kafka是什么 kafka是分布式的、高并发的、基于发布/订阅模式的消息队列软件系统。 kafka中的重要组件 Producer:消息生产者,发布消息到Kafka集群的终端或服务Consume:消费者,从Kafka集群中消费消息的终端或服…

CAN报文的发送类型-OnChange、OnWrite、IfActive、Repetition

CAN报文的发送类型分为基本发送类型和混合发送类型两大类 CAN基本发送类型包括Cyclic周期发送、OnChange变化时发送、OnWrite写入时发送和IfActive有效时发送。基本发送类型中的Cyclic称为周期型,而其他3个类型称为事件型(Event)。发送次数是通过定义Repetition重复次数来实…

AI 编程探索- iOS动态标签控件

需求分析: 标签根据文字长度,自适应标签居中显示扩展 超过内容显示范围,需要换行显示,且保持居中显示 AI实现过程 提问: 回答: import UIKit import SnapKitclass DynamicLabelsContainerView: UIView…

python基础篇(5):None类型

1 None类型 Python中有一个特殊的字面量&#xff1a;None&#xff0c;其类型是&#xff1a;<class NoneType> 无返回值的函数&#xff0c;实际上就是返回了&#xff1a;None这个字面量 None表示&#xff1a;空的、无实际意义的意思 函数返回的None&#xff0c;就表示…

[MYSQL] MYSQL库的操作

前言 本文主要介绍MYSQL里 库 的操作 请注意 : 在MYSQL中,命令行是不区分大小写的 1.创建库 create database [if not exists] database_name [charsetutf8 collateutf8_general_ci] ...] create database 是命名语法,不可省略[if not exists] 如果不存在创建,如果存在跳过…

基于CRITIC-TOPSIS法的各地区评价

1.CRITIC-TOPSIS法原理 1.1 基本理论 CRITIC-TOPSIS法是一种结合CRITIC&#xff08;Criteria Importance Through Intercriteria Correlation&#xff09;法和TOPSIS&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09;法的综合评价方法…

盲盒小程序开发:解锁未知,探索无限惊喜

一、开启新篇章 在追求独特与新颖的时代&#xff0c;盲盒以其神秘感与未知性&#xff0c;成为了年轻人热衷的购物新方式。为了满足这一市场需求&#xff0c;我们精心打造了一款全新的盲盒小程序&#xff0c;带您步入一个充满未知与惊喜的购物新领域。 二、产品亮点 精选商品&…

B端系统:日历组件设计,小组件蕴含大学问。

B端日历组件在企业级应用中具有重要作用&#xff0c;它可以用于管理和展示企业内部的日程安排、会议安排、任务分配等。 设计B端日历组件时&#xff0c;可以考虑以下几点&#xff1a; 显示方式&#xff1a;提供多种显示方式&#xff0c;例如月视图、周视图、日视图等&#xf…

FineReport聚合报表与操作

一、报表类型 模板设计是 FineReport 学习过程中的主要难题所在&#xff0c;FineReport 模板设计主要包括普通报表、聚合报表、决策报表三种设计类型。 报表类型简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 二、聚合报表 2-1 介绍 聚合报表指一个报表中包含多个…

解决了!暗影精灵8 Pro酷睿版无声音,扬声器和麦克风都没有声音!

困扰好几天的问题解决了&#xff01; 暗影精灵8 Pro酷睿版无声音&#xff0c;扬声器和麦克风都没有声音&#xff01;&#xff01;方法适用于OMEN by HP Gaming Laptop 16-k0xxx&#xff08;暗影精灵8 Pro酷睿版&#xff09;的Windows 10声卡驱动&#xff01; 朋友们&#xff…

启动VMWare虚拟机报错

1. 无法打开内核设备“\\.\VMCIDev\VMX”: 操作成功完成。是否在安装 VMware Workstation 后重新引导? 模块“DevicePowerOn”启动失败。 未能启动虚拟机。 解决办法: 解决办法: 将 Ubuntu 64 位.vmx 找到vmci0.present"TRUE"这行改成 vmci0.present "FAL…

pinia.js报patchToApply.hasOwnProperty is not a function

vue3 ts pinia.js 先看报错> patchToApply.hasOwnProperty is not a function 错误信息&#xff1a; pinia.js?v91704efd:913 Uncaught (in promise) TypeError: patchToApply.hasOwnProperty is not a functionat mergeReactiveObjects (pinia.js?v91704efd:913:23)…

【学习】软件测试中常见的文档类型及其作用

在软件开发的生命周期中&#xff0c;软件测试是确保产品质量的关键步骤。为了系统地进行测试活动&#xff0c;并保证测试结果的有效性和可追溯性&#xff0c;产生了一系列标准化的测试文档。这些文档不仅为测试人员提供了执行指南&#xff0c;而且为项目管理者和利益相关者提供…

外部建筑3D 渲染的 5个关键角度,让你的效果图更具吸引力

对于建筑师和房地产专业人士来说&#xff0c;拥有大量高质量的项目图片至关重要&#xff0c;因为这可以吸引更多的潜在客户。。在展示您的3D效果图时&#xff0c;摄像机角度是一个关键因素。不同的视角影响细微的细节、当地环境和建筑亮点&#xff0c;最终影响项目的感知。那么…

网络编程篇: HTTPS协议

一.前置知识 早期很多公司刚起步的时候&#xff0c;使用的应用层协议都是HTTP&#xff0c;而HTTP无论是用GET方法还是POST方法传参&#xff0c;都是没有经过任何加密的&#xff0c;因此早期很多的信息都是可以通过抓包工具抓到的。 为了解决这个问题&#xff0c;于是出…