Java 中 Hashtable和ConcurrentHashMap的区别

Hashtable和ConcurrentHashMap的区别

HashtableConcurrentHashMap 都是 Java 中的集合框架中的 Map 接口实现类,但它们之间有很大的不同,特别是在多线程环境中。下面是它们之间的一些主要区别:

  1. 线程安全性

    • Hashtable 是线程安全的,因为它的大部分方法都是同步的。这意味着在多线程环境中,对 Hashtable 的操作是安全的,但可能会导致性能下降,因为每次只有一个线程可以访问它。
    • ConcurrentHashMap 也是线程安全的,但它使用了一种不同的方法来实现线程安全,称为分段锁。它允许多个线程同时写入 ConcurrentHashMap,只要它们正在写入不同的段(或段集合)。这使得 ConcurrentHashMap 在多线程环境中的性能优于 Hashtable
  2. null 值和 null 键

    • Hashtable 不允许使用 null 作为键或值。
    • ConcurrentHashMap 允许使用 null 作为键,但不允许使用 null 作为值。
  3. 迭代

    • Hashtable 中,如果在迭代过程中修改了映射(除了通过迭代器自身的 remove 方法),那么迭代器将抛出 ConcurrentModificationException
    • ConcurrentHashMap 的迭代器对映射表在创建后的其他修改具有弱一致性。这意味着迭代器最多只能反映出在创建时已存在的所有条目,以及那些在迭代过程中被访问的条目。如果在迭代过程中映射表被其他线程修改,迭代器不会抛出异常。
  4. 性能

    • 由于 Hashtable 的所有方法都是同步的,因此在单线程环境中,其性能可能略低于非同步的 HashMap。而在多线程环境中,其性能可能受到线程间争用的影响。
    • ConcurrentHashMap 在多线程环境中的性能通常优于 Hashtable,因为它使用了分段锁来减少线程间的争用。

总的来说,如果你需要在多线程环境中使用 Map,并且需要允许 null 键和/或需要更高的性能,那么 ConcurrentHashMap 可能是更好的选择。如果你不需要这些特性,或者你的代码是单线程的,那么 HashtableHashMap 可能就足够了。

Hashtable和ConcurrentHashMap的使用示例代码

下面是HashtableConcurrentHashMap的使用示例代码。

Hashtable的使用示例

import java.util.Hashtable;public class HashtableExample {public static void main(String[] args) {// 创建一个HashtableHashtable<String, String> hashtable = new Hashtable<>();// 向Hashtable中添加元素hashtable.put("key1", "value1");hashtable.put("key2", "value2");hashtable.put("key3", "value3");// 访问Hashtable中的元素System.out.println("Value for key1: " + hashtable.get("key1"));// Hashtable不支持null键和null值// hashtable.put(null, "null value"); // 这将抛出NullPointerException// hashtable.put("null key", null); // 这也将抛出NullPointerException// 遍历Hashtablefor (String key : hashtable.keySet()) {System.out.println("Key: " + key + ", Value: " + hashtable.get(key));}}
}

ConcurrentHashMap的使用示例

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapExample {public static void main(String[] args) throws InterruptedException {// 创建一个ConcurrentHashMapConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();// 向ConcurrentHashMap中添加元素concurrentHashMap.put("key1", "value1");concurrentHashMap.put("key2", "value2");concurrentHashMap.put("key3", "value3");// 访问ConcurrentHashMap中的元素System.out.println("Value for key1: " + concurrentHashMap.get("key1"));// ConcurrentHashMap支持null键,但不支持null值concurrentHashMap.put(null, "null value"); // 这是允许的// concurrentHashMap.put("null key", null); // 这将抛出NullPointerException// 遍历ConcurrentHashMapfor (String key : concurrentHashMap.keySet()) {System.out.println("Key: " + key + ", Value: " + concurrentHashMap.get(key));}// 演示ConcurrentHashMap的线程安全特性Thread thread1 = new Thread(() -> {concurrentHashMap.put("key4", "value4 from thread 1");});Thread thread2 = new Thread(() -> {concurrentHashMap.put("key5", "value5 from thread 2");});thread1.start();thread2.start();// 等待线程完成thread1.join();thread2.join();// 输出最终的ConcurrentHashMapSystem.out.println("Final ConcurrentHashMap:");for (String key : concurrentHashMap.keySet()) {System.out.println("Key: " + key + ", Value: " + concurrentHashMap.get(key));}}
}

在上面的ConcurrentHashMap示例中,我们创建了两个线程,它们尝试同时向ConcurrentHashMap中添加元素。由于ConcurrentHashMap是线程安全的,因此这两个线程可以安全地并发执行,而不会导致ConcurrentModificationException或其他并发问题。

请注意,虽然ConcurrentHashMap支持null键,但它不支持null值。尝试将null作为值插入ConcurrentHashMap将抛出NullPointerException

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

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

相关文章

<网络安全>《30 网络信息安全基础(1)常用术语整理》

1 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是WINDOWS系统&#xff0c;也可以是UNIX/LINUX系统&#xff0c;可以是普通的个人电脑&#xff0c;也可以是大型的服务器&#xff0c;我们可以象操作自己的电脑那样来操…

网络世界的基石:深入探索OSI 7层模型的奥秘

引言 在当今互联网和计算机网络的复杂体系中&#xff0c;OSI&#xff08;开放系统互连&#xff09;参考模型提供了一个理解和设计网络通信协议的框架。自1984年由国际标准化组织&#xff08;ISO&#xff09;提出以来&#xff0c;OSI 7层模型已成为网络通信中最基本的概念之一。…

re:从0开始的CSS之旅 15. 浮动

1. 浮动 浮动&#xff1a;使元素浮起来&#xff0c;脱离文档流&#xff0c;从而使盒子能够灵活的移动。 浮动的属性&#xff1a; float 属性设置元素的浮动 可选值&#xff1a; none 元素不浮动&#xff0c;默认在文档流中排列&#xff08;默认值&#xff09; left 元素向左移…

「数据结构」MapSet

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;欢迎点赞收藏加关注哦&#xff01; Map&Set &#x1f349;概念&#x1f349;模型&#x1f349;Map&#x1f34c;TreeMap和HashMap的区别&#x1f34c;Map常用方…

2048游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第二天-ARM按键1*3矩阵键盘编程 (物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1E4x2TX_9SYhxM9sWfnehMg?pwd1688 提取码&#xff1a;1688 1、键盘1*3的中断程序 //************************************************ #include "2440addr.h" #include "2440lib.h" #include &…

Days 31 ElfBoard 自启脚本中打开看门狗

1.在开机自启脚本中打开看门狗 rootELF1:~# vi /etc/rc.local 2.在自启脚本中添加上之后&#xff0c;然后在咱们的QT界面中找到看门狗应用&#xff0c; 发现显示打开看门狗失败&#xff1a; 3.修改看门狗源码&#xff0c;设置了超时时间后&#xff0c;关闭/dev/dev/watchdog节…

【Tomcat】:One or more listeners failed to start.报错解决方案

报错信息:One or more listeners failed to start. Full details will be found in the appropriate container log file. 具体就是web.xml此配置报错: 服务器启动错误Tomcat:One or more listeners failed to start.报错解决方案 IDEA:在使用IDEA运行SSM项目的时候 , Tomcat运…

.NET Core性能优化技巧

.NET Core作为一个跨平台的开源框架&#xff0c;以其高效、灵活和可扩展的特性受到了广大开发者的青睐。但在实际开发中&#xff0c;如何确保应用程序的性能始终是一个关键的问题。本文将介绍十大.NET Core性能优化技巧&#xff0c;帮助开发者提升应用程序的性能。 1. 使用异步…

error MSB8008: 指定的平台工具集(v143)未安装或无效。请确保选择受支持的 PlatformToolset 值解决办法

右击解决方案&#xff0c;选择属性 将工具集为143的修改为其他&#xff0c;如图 重新编译即可运行

网络原理(3)--以太网协议,DNS

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(3)–以太网协议,DNS 在网络原理(2)中介绍了网络层中的一个重要的协议–ip协议,网络层关注的通信时的起点和终点,而数据链路层更加"底层"一些,关注的是传输过程…

关于TypeError:无法读取null属性(读取‘isCE‘) -自定义组件库

关于TypeError:无法读取null属性(读取’isCE’) -自定义组件库 大家先看一下这个文章 https://cloud.tencent.com/developer/ask/sof/106913760 这个文章里面给了vite解决方案 这里我给出一个webpack解决方案 首先我建议你的组件库和你的项目进行vue版本锁定 第二补在你的vue.c…

假期作业 11

整理chmod、chgrp、chown指令的应用成文档 chmod 文件分类: bcd-lsp d 目录 - 普通文件 b 块设备驱动文件 磁盘 c 字符设备驱动文件 键盘 鼠标 l link 链接文件 软连接 硬连接 网络编程 s socket 套接字文件 网络编程 p pipe 管道文件 权限内容 r read w write - 无…

【Effective Objective - C 2.0】——读书笔记(四)

文章目录 二十三、通过委托与数据源协议进行对象间通信二十四、将类的实现代码分散到便于管理的数个分类之中二十五、总是为第三方的分类名称加前缀二十六、切勿在分类里面声明属性二十七、使用“class-continuation分类”隐藏实现细节二十八、通过协议提供匿名对象 二十三、通…

springboot187社区养老服务平台的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

剑指大数据-企业级数据仓库项目实战

第1章 大数据与数据仓库概论 大数据生态圈分为7层&#xff0c;这7层可以概括为数据采集层、数据计算层、数据应用层3层结构。 第4章 用户行为数据采集模块 4.1日志生成 4.1.1数据埋点 用户行为日志的内容&#xff0c;主要包括用户的各项行为信息&#xff0c;以及行为所…

MySQL 基础知识(六)之数据查询(一)

目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…

源码推荐:hello-algo @ github

github https://github.com/krahets/hello-algo 本项目旨在创建一本开源、免费、对新手友好的数据结构与算法入门教程。全书采用动画图解&#xff0c;结构化地讲解数据结构与算法知识&#xff0c;内容清晰易懂&#xff0c;学习曲线平滑。算法源代码皆可一键运行&#xff0c;支…

超越Swagger和Postman:使用Visual Studio的.http文件轻松调试Web API

在软件开发过程中&#xff0c;调试Web API是至关重要的环节。传统上&#xff0c;开发人员经常使用Swagger或Postman等工具来测试API。然而&#xff0c;Visual Studio提供了一项内置功能&#xff0c;使用.http文件可以更快速、简便地调试Web API。本文将介绍如何使用Visual Stud…

Node.js开发-包管理工具

包管理工具 1) 概念2) npm3) 配置命令别名 1) 概念 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除 &#xff0c; 上传 等操作 借助包管理工具&#xff0c;可以快速开发项目&#xff0c;提升开发效率 下面列举了前端常用的…