HashMap 与 ConcurrentHashMap 的区别2025年3月27日 | 阅读 4 分钟 HashMap 是 Java 中一个强大的数据结构,用于存储键值对。它通过关联的键来映射值。它允许我们存储 null 值和 null 键。它是一个非同步的 Java 集合类。而 ConcurrentHashMap 作为 HashMap 的替代品被引入。 ConcurrentHashMap 是一个同步的集合类。 HashMap 是非线程安全的,不能在并发的多线程环境中使用。相比之下,ConcurrentHashMap 是线程安全的,专门为多线程和并发环境设计。 在本节中,我们将基于线程安全、同步、性能、用途等多个参数来比较 HashMap 和 ConcurrentHashMap 的区别。 以下是 HashMap 和 ConcurrentHashMap 的一些主要区别
让我们看一些示例来理解 HashMap 和 ConcurrentHashMap 的行为。 HashMap 和 Concurrent HashMap 的示例考虑以下示例来理解 HashMap 的行为。 示例 1 输出 {null=Sofia, 100=Stark, 101=Michale, 102=Ani} 现在使用 ConcuurentHashMap 来理解相同的示例。 使用 ConcurrentHashMap 输出 Exception in thread "main" java.lang.NullPointerException at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011) at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006) at ConcurrentHashMapExample.main(ConcurrentHashMapExample.java:9) 从上面的示例可以看出,HashMap 允许键值对为空,但在 ConcurrentHashMap 中,我们不能将 null 值用于键值组合;否则会抛出 NullPointerException。 示例 2 在 HashMap 中,如果一个线程正在迭代对象,而另一个线程尝试迭代对象,则会抛出运行时异常。但是,在 ConcurrentHashMap 中,可以同时由两个或多个线程迭代对象。 考虑下面的示例 使用 HashMap // 使用 HashMap 通过两个线程同时添加对象的 Java 程序 输出 100=X 101=Y Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445) at java.util.HashMap$EntryIterator.next(HashMap.java:1479) at java.util.HashMap$EntryIterator.next(HashMap.java:1477) at HashMapExample2.main(HashMapExample2.java:27) 从上面的示例可以看出,当子线程尝试与其他线程同时添加对象时,会抛出运行时异常。让我们使用 ConcurrentHashMap 执行相同的代码。 使用 ConcurrentHashMap 输出 100=X 101=Y 102=Z 103=D {100=X, 101=Y, 102=Z, 103=D} 从上面的示例可以看出,在 ConcurrentHashMap 中,我们可以使用两个不同的线程轻松地同时添加对象。但是,在 HashMap 中是不可能的。 ConcurrentHashMap 相对于 HashMap 的优点使用 ConcurrentHashMap 的优点如下:
让我们根据不同参数直接比较 HashMap 和 ConcurrentHashMap。
总结 我们已经讨论了 HashMap 和 ConcurrentHashMap 之间所有主要的区别。为这次讨论做一个最终的总结,我们想说 ConcuurentHashMap 在多线程环境中很有益,并且比 HashMap 性能更好。它提供了线程安全、可伸缩性和同步。对于单线程环境,HashMap 的性能略优于 ConcurrentHashMap。 下一主题Java 多线程层次结构 |
丰数(Abundant number),也称为过剩数,是一个正整数,其真因子(不包括本身)之和大于该数本身。换句话说,丰数是因子“丰富”的数。让我们探讨一下……
阅读 4 分钟
引言 503 错误是在访问网站或 Web 应用程序时最常见和最令人沮丧的错误之一。当查看网页或使用某些基于 Web 的应用程序时,通常会看到此错误。错误代码表示服务器暂时无法处理请求...
阅读 6 分钟
给定一个具有 N 行 M 列的二维数组 ARR,其中每个元素都包含 0 或 1 的值,将给定的矩阵转换为一个“好”矩阵。在“好”矩阵中,如果一个元素为 0,则其行和列中的所有元素都应...
5 分钟阅读
Web 浏览器利用一种称为 CORS(跨域资源共享)的安全功能,阻止网站向非原始域发出请求。通过限制 Web 应用程序只能与来自其原始域的资源进行交互,除非获得明确许可...
阅读 2 分钟
? File: RemoveChar .java public class RemoveChar { public static void main(String[] args) { String str = "India is my country"; System.out.println(charRemoveAt(str, 7)); } public static String charRemoveAt(String str, int p) { ...
阅读1分钟
在数组中查找缺失的数字是编程中一个常见的问题。它经常出现在数据验证、错误检查或解决数学谜题等场景中。在本节中,我们将探讨如何使用 Java 编程语言在数组中查找缺失的数字....
阅读9分钟
FloatBuffer put() 主要有两种方法,它们接受不同的参数。put(float f) put(int index, float f) i. put(float f) java.nio.FloatBuffer 类具有 put(float f) 函数。新生成的浮点缓冲区以指定浮点数写入当前位置,然后位置会递增...
5 分钟阅读
在 Java 中,归约(reduction)是一种终端操作,它将流聚合为一种类型或基本类型。Java 8 提供的 Stream API 包含一组预定义的归约操作,例如 average()、sum()、min()、max() 和 count()。这些操作通过组合元素来返回一个值…
5 分钟阅读
在上一节中,我们讨论了 Java 中的不同模式程序。在本节中,我们将创建用于锯齿星形和数字模式的 Java 程序。打印锯齿数字模式的步骤:先打印一个反斜杠,然后打印一个正斜杠,然后继续。输入总字符数...
7 分钟阅读
Java 是一种通用且广泛使用的编程语言,它是实现各种算法和数学概念的绝佳选择。其中一个概念是处理圆。在本节中,我们将探讨如何在 Java 中编写 Circle 程序,涵盖不同的方法...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India