【Java】HashMap、HashTable和ConcurrentHashMap的区别

在这里插入图片描述

文章目录

  • 区别
  • 一、HashMap
    • 1.1基本定义与特性
    • 1.2工作原理与实现
    • 1.3常用方法
    • 1.4性能与优化
  • 二、HashTable
  • 三、ConcurrentHashMap
    • 3.1基本特点
    • 3.2实现原理
    • 3.3常用方法
    • 3.4适用场景
    • 3.5性能优化

HashTable、HashMap和ConcurrentHashMap之间的区别主要体现在线程安全、继承关系与实现接口、对null值的处理、性能以及数据结构等几个方面。以下是对这三者之间区别的详细分析:

区别

项目HashMapHashTableConcurrentHashMap
null键允许(仅能有一个)不允许允许(仅能有一个)
null值允许不允许允许
性能高(单线程下最高)多线程下优于HashTable
数据结构数组+链表+红黑树数组+链表数组+链表+红黑树
继承关系AbstractMap类Dictionary类AbstractMap类
实现接口实现了Map接口Cloneable接口和Serializable接口实现了Map接口实现了Map接口、Cloneable接口和Serializable接口
线程安全不安全安全安全
同步方式synchronized同步方法1.7版本:基于segment分段锁机制,基于ReentrantLock实现;1.8版本:基于CAS+synchronized实现,空节点插入使用CAS,有Node节点则使用synchronized加锁

一、HashMap

HashMap是Java中的一种基于哈希表实现的数据结构,它实现了Map接口并允许使用null键和null值。

1.1基本定义与特性

基于哈希表: HashMap是基于哈希表实现的,通过哈希函数将键映射到索引位置,实现快速查找。
允许null键和值: 与HashTable不同,HashMap允许使用null作为键和值。
非线程安全: HashMap不是线程安全的,因此在多线程环境下使用时需要注意数据一致性问题。

1.2工作原理与实现

哈希函数: HashMap使用哈希函数将键转换为索引,该函数需要满足确定性、高效性和散列性。
冲突解决: 采用链地址法处理哈希冲突,即多个键哈希到同一个索引时,它们会被链接到一个链表中。
动态扩容: 当元素数量超过当前容量的阈值时,HashMap会进行rehashing,创建一个新的数组,并将原数组中的元素重新哈希到新的数组中。

1.3常用方法

put(K key, V value): 向HashMap中添加一个键值对。
get(Object key): 根据键获取对应的值。
remove(Object key): 删除HashMap中指定的键值对。
size(): 返回HashMap中键值对的数量。
isEmpty(): 判断HashMap是否为空。
keySet(): 返回HashMap中所有键的集合。
values(): 返回HashMap中所有值的集合。
entrySet(): 返回HashMap中所有键值对组成的集合。

1.4性能与优化

时间复杂度: HashMap的查找、插入和删除操作的平均时间复杂度为O(1),但在哈希冲突严重时,性能会下降。
链接: 【哈希表】为什么哈希表的插入/删除/查找时间复杂度为O(1)

初始容量与加载因子: 合理设置HashMap的初始容量和加载因子可以提高性能。初始容量是HashMap创建时分配的数组大小,加载因子是触发扩容的阈值。
红黑树优化: 在JDK 1.8及以后的版本中,当链表长度超过一定阈值时,HashMap会将链表转换为红黑树以提高查找性能。

总之,HashMap是一种高效且灵活的数据结构,适用于需要快速查找键值对的场景。在使用时需要注意其非线程安全的特性,并在必要时采取适当的同步措施。

二、HashTable

HashTable(哈希表)是一种根据关键码值直接进行访问的数据结构。它通过特定的哈希函数将关键码值映射到表中的一个位置,以加快数据查找的速度。

  1. HashTable同样是基于哈希表实现,存储的数据同样为key-value键值对,其内部也是通过单链表解决哈希冲突的,容量不足时,同样会自动扩容;

  2. 线程安全,可以用于多线程场景。它的线程安全实现方式是:所有的方法都使用synchronized加锁,像一些读操作不存在线程不安全问题,所以全部方法加锁导致了效率低下。

  3. 现在已经被丢了不再使用了。不涉及线程安全问题时使用HashMap,要保证线程安全时,使用ConcurrentHashMap。

三、ConcurrentHashMap

ConcurrentHashMap是Java集合框架中的一个类,它是HashMap的一个线程安全版本,专为高并发场景设计

3.1基本特点

线程安全: ConcurrentHashMap通过特殊的锁机制和数据结构来确保线程安全,使得多个线程可以并发地读写不同的数据段,而不需要额外的同步措施。

高并发性能: 由于采用了分段锁机制(在Java 8之前)或更精细的锁策略(如CAS和synchronized在Java 8及之后),ConcurrentHashMap能够支持多个线程同时访问不同的数据段,从而提高了并发性能。

支持高效的读操作: 在没有竞争的情况下,读操作几乎没有性能损耗,因为它们可以并行执行。

不允许null键或值: 与HashMap不同,ConcurrentHashMap不允许键或值为null。

3.2实现原理

分段锁机制(Java 7及之前): ConcurrentHashMap在内部将数据分为多个段(Segment),每个段都有自己的锁。当一个线程访问某个段时,它只会锁定该段,而不会锁定整个ConcurrentHashMap。这使得多个线程可以同时访问不同的段,从而提高了并发性能。

更精细的锁策略(Java 8及之后): 在Java 8中,ConcurrentHashMap的实现进行了改进,不再使用分段锁,而是采用了CAS操作和synchronized关键字来实现更精细的锁控制,进一步提高了并发性能。

3.3常用方法

ConcurrentHashMap提供了一系列与HashMap相似的方法,如put、get、remove等,这些方法都是线程安全的。
此外,它还提供了一些原子操作,如putIfAbsent、remove、replace等。

3.4适用场景

ConcurrentHashMap适用于需要在线程安全的环境下使用HashMap的场景,特别是需要实现高并发下的数据访问控制的场景
例如,在多线程环境中记录日志信息时,可以使用ConcurrentHashMap来存储日志数据,以确保数据的一致性和安全性。

3.5性能优化

Java 8对ConcurrentHashMap进行了一些性能优化,包括利用CAS操作替换了之前的Synchronized关键字来减少锁的争用等。这些优化进一步提高了ConcurrentHashMap的并发性能。


以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!💞💞💞

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

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

相关文章

kaggle 泰坦尼克号2 得分0.7799

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

从C到JAVA之学习JAVA的第一周笔记

文章目录 java语言概述JDK与JRE编写执行过程第一份java代码解读编写编译运行其他 注释三种注释方法 java API文档关键字标识符数据类型基本数据类型自动类型提升规则引用数据类型 string概述String与基本数据类型的变量间的运算 运算符键盘录入运行控制语句数组定义与静态初始化…

springboot no mapping for.....解决办法

这个问题是由于没有加入对应的GET,POST注解,导致映射失败,加入对应注解就ok了

JDK 11下载、安装、配置

下载 到Oracle管网下载JDK 11,下载前需要登录,否则直接点下载会出现502 bad gateway。 下载页面链接 https://www.oracle.com/hk/java/technologies/downloads/#java11-windows 登录 有些人可能没有Oracle账号,注册也比较慢,有需…

随笔05 我的创作纪念日(512天)

机缘 机缘这事儿,我在随笔系列博文里已经翻来覆去说了不少,这次就不再唠叨了,省得被小伙伴嫌弃成祥林嫂~😜 🌸随笔01 我的创作纪念日(128天)_newmitbbs-CSDN博客 收获 我这一小片自留地&…

JavaEE 初阶篇-深入了解 File 文件操作(实现文件搜索、非空文件夹删除)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 File 文件概述 2.0 创建 File 类对象的方法 2.1 判断文件类型、获取文件信息的方法 2.2 创建文件、删除文件的方法 2.3 遍历文件夹的方法 3.0 文件搜索与删除 3.1…

WebSocket 快速入门 - springboo聊天功能

目录 一、概述 1、HTTP(超文本传输协议) 2、轮询和长轮询 3、WebSocket 二、WebSocket快速使用 1、基于Java注解实现WebSocket服务器端 2、JS前端测试 三、WebSocket进阶使用 1、如何获取当前用户信息 2、 后端聊天功能实现 一、概述 HTTP…

PVE grub resue错误修复 lvmid BUG

服务器断电后启动不起来,显示grub resue 找了半天没有找到修复方法。看官方文档有一处Recovering from grub “disk not found” error when booting from LVM 极为类似。https://pve.proxmox.com/wiki/Recover_From_Grub_Failure 下面是处理过程。 使用PVE 6.4启…

Leetcode算法训练日记 | day33

专题九 贪心算法 一、跳跃游戏 1.题目 Leetcode:第 55 题 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 …

机器学习(二)之监督学习

前言: 上一节大概讲解了几种学习方式,下面几张就具体来讲讲监督学习的几种算法。 以下示例中和都是权重的意思!!! 注:本文如有错误之处,还请读者指出,欢迎评论区探讨! 1…

MATLAB实现图片栅格化

MATLAB实现图片栅格化 1.读取图片:首先,你需要使用imread函数读取要栅格化的图片。 2.设置栅格大小:确定你希望将图片划分成的栅格大小,即每个栅格的宽度和高度。 3.计算栅格数量:根据图片的总尺寸和栅格大小&#…

Compose 布局

文章目录 Compose 布局ColumnColumn属性使用 RowRow属性使用 BoxBox属性使用 ConstraintLayoutLazyColumnLazyColumn属性使用使用多类型使用粘性标题回到顶部 LazyRowLazyRow属性使用 LazyVerticalGridLazyVerticalGrid属性使用 Compose 布局 Column Compose中的”垂直线性布…

F-logic DataCube3 SQL注入漏洞复现(CVE-2024-31750)

0x01 产品简介 F-logic DataCube3是一款用于光伏发电系统的紧凑型终端测量系统。 0x02 漏洞概述 F-logic DataCube3 /admin/pr_monitor/getting_index_data.php 接口处存在SQL注入漏洞,未经身份验证的攻击者可通过该漏洞获取数据库敏感信息,深入利用可控制整个web服务器。 …

计算机图形学:直线生成算法—DDA

DDA(Digital Differential Analyzer,数字差分分析器)算法是一种基本的直线生成算法,通常用于计算机图形学中。它通过将直线划分为若干个等间隔的小线段,然后在每个小线段中选择一个像素点进行绘制,从而近似…

产品原型图概念

产品原型图概念 产品原型图作用 如下图: 产品原型图的三种分类 线框图 通过【线段色块文字】描述产品页面。优点:制作快速。 缺点:传递信息容易遗漏。 应用:早期方案讨论,需要快速输出的场景,团队配合…

Learn ComputeShader 01 First Computer Shader

使用Unity版本:2019.4.12f1 整体流程: 1添加一个quad object并添加一个无光照材质 2.相机投影模式设置为正交 3.调整quad使其完全显示在相机内 4.创建脚本并且使用计算着色器覆盖quad的纹理 5.创建一个compute shader 前三步完成以后结果应该是这…

网络基础先导

前言:最好在牢固前面几大件(编程语言、数据结构、操作系统),并且您有一个服务器的基础上(我使用的是腾讯云中配置最低的服务器)再来学习本系列的网络知识。 1.网络发展简要 下面就是简单提及一些概念而已&…

二叉树之AVL树

文章目录 1. AVL树的概念(logN)1.1背景1.2规则 2.AVL树节点的定义3.AVL树的插入4. AVL树的旋转(重点)4.1 新节点插入较高的右子树的右侧:左单璇;4.2 新节点插入较高左子树的左侧:右单璇;4.3(双旋…

AJAX——ajax原理

1.XMLHttpRequest 定义:XMLHttpRequest(XHR)对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。XMLHttpRequest在AJA…

数据输入输出流(I/O)

文章目录 前言一、数据输入输出流是什么?二、使用方法 1.DataInputStream类2.DataOutoutStream类3.实操展示总结 前言 数据输入输出流也是将文件输入输出流打包后使用的对象。相比于文件输入输出流,数据输入输出流提供了简单易用的方法去操作不同类型的数…