以下是Java中HashMap和ConcurrentHashMap类之间的显着差异。
哈希映射 | 并发哈希映射 | |
---|---|---|
已同步 | HashMap不同步。 | ConcurrentHashMap已同步。 |
线程安全 | HashMap不是线程安全的。 | ConcurrentHashMap是线程安全的。 |
迭代器类型 | HashMap迭代器是快速失败的,并且如果在迭代过程中发生并发修改,则ArrayList会引发ConcurrentModificationException。 | ConcurrentHashMap是故障安全的,并且在迭代过程中永远不会抛出ConcurrentModificationException。 |
空值 | HashMap允许键和值为null。 | ConcurrentHashMap不允许使用空键/值。它将抛出NullPointerException。 |
性能 | HashMap更快。 | ConcurrentHashMap比HashMap慢。 |
从Java版本开始 | 1.2 | 1.5 |
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class Tester { public static void main(String[] args) { List<String> arrayList = new ArrayList<>(); arrayList.add("A"); arrayList.add("B"); arrayList.add("C"); Iterator<String> iterator = arrayList.iterator(); System.out.println(arrayList); while (iterator.hasNext()) { if (iterator.next().equals("C")) { //允许删除。 iterator.remove(); } } System.out.println(arrayList); List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>(); copyOnWriteArrayList.add("A"); copyOnWriteArrayList.add("B"); copyOnWriteArrayList.add("C"); Iterator<String> iterator1 = copyOnWriteArrayList.iterator(); System.out.println(copyOnWriteArrayList); while (iterator1.hasNext()) { if (iterator1.next().equals("C")) { try{ iterator1.remove(); }catch(UnsupportedOperationException e){ System.out.println("不允许移除。"); } } } System.out.println(copyOnWriteArrayList); } }
输出结果
[A, B, C] [A, B] [A, B, C] 不允许移除。 [A, B, C]