【Java】HashMap、HashTable和ConcurrentHashMap的区别

ops/2024/11/14 13:24:24/

在这里插入图片描述

文章目录

  • 区别
  • 一、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.ppmy.cn/ops/13536.html

相关文章

蓝桥杯2024年第十五届省赛真题-握手问题

方法一&#xff1a;模拟 #include<bits/stdc.h> using namespace std; #define int long long const int n1e6; int a,b[n],c; signed main() {for(int i1;i<50;i){for(int ji1;j<50;j){if(i<7&&j<7){continue;}c;}}cout<<c<<endl; }方…

DBeaver(其他可视化工具一样的逻辑)连接IoTDBDriver教程

DBeaver(其他可视化工具一样的逻辑&#xff09;连接IoTDBDriver教程 一 下载安装 官网下载链接&#xff1a; https://iotdb.apache.org/Download/二 安装 DBeaver 三 连接 点确定 选择IoTDB驱动 点击下一步 点击测试链接 点击确定 注意: 需要自己写查询语句才能看见…

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为&#xff1a; Python函数的黑魔法&#xff1a;递归&#xff0c;嵌套函数与装饰器 个人主页&#xff1a;CILMY23-CSDN博客 系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff…

笔记 | 嵌入式系统概论

1 嵌入式系统简介 1.1 嵌入式系统的定义 根据美国电气与电子工程师学会&#xff08;IEEE&#xff1a;Institute of Electrical and Electronics Engineers )的定义&#xff0c;嵌入式系统是用于控制、监视或辅助操作机器和设备的装置(原文: devices used to control, monitor…

大坝安全监测GNSS接收机:保障水库安全

大坝安全一直是社会关注的焦点之一。为了及时监测大坝的变形和位移情况&#xff0c;以预防可能发生的危险事故&#xff0c;GNSS接收机成为了不可或缺的仪器之一。本文将详细介绍GNSS接收机在大坝安全监测中的应用及其重要性。 一、GNSS接收机是什么 GNSS全球导航卫星系统&…

mysql 面试题

事务是什么 事务是数据库管理系统&#xff08;DBMS&#xff09;中的一个重要概念&#xff0c;用于管理对数据库进行读写操作的一组相关操作。事务是一个原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;的工作单元。 具体来说&#xff0c;事务具有以下四个特性&a…

产品推荐 | 基于Anlogic系列EG4S20 FPGA开发板

1、产品概述 国产FPGA是最近几年起来的产品。ANLOGIC 是国产FPGA组织一成员&#xff0c;ANLOGIC芯片具有性价比高特点。高云FPGA&#xff0c;很多用户都用在LED&#xff0c;电机控制&#xff0c;PLC设备上&#xff0c;接口扩展。在国产化平台&#xff0c;Altera &#xff0c;L…

《HCIP-openEuler实验指导手册》1.2Apache主页面配置

一、配置服务器监听IP及端口 注释主配置文件“监听IP及端口”部分 cd /etc/httpd/conf cp httpd.conf httpd.conf.bak vim httpd.conf可以在普通模式下搜索Listen关键字 :/Listen按n键继续向后搜索 在/etc/httpd/conf.d中新建子配置文件port.conf&#xff1a; touch /etc…