HashMap 和 ConcurrentHashMap 的区别
HashMap 是传统集合下的类,而 ConcurrentHashMap 是并发集合下的类,除此之外,它们之间还有各种不同之处:
- HashMap 本质上是非同步的,即 HashMap 不是线程安全的,而 ConcurrentHashMap 本质上是线程安全的。
- HashMap 性能相对较高,因为它本质上是非同步的,并且可以同时执行任意数量的线程。但是 ConcurrentHashMap 性能有时会很低,因为有时线程需要等待 ConcurrentHashMap。
- 当一个线程正在迭代 HashMap 对象时,如果其他线程尝试添加/修改 Object 的内容,那么我们将得到运行时异常ConcurrentModificationException 。而在 ConcurrentHashMap 中,在迭代时执行任何修改时我们不会得到任何异常。
使用哈希映射
// Java program to illustrate // HashMap drawbacks import java.util.HashMap; class HashMapDemo extends Thread { static HashMap
l=new HashMap (); public void run() { try { Thread.sleep(1000); // Child thread trying to add // new element in the object l.put(103,"D"); } catch(InterruptedException e) { System.out.println("Child Thread going to add element"); } } public static void main(String[] args) throws InterruptedException { l.put(100,"A"); l.put(101,"B"); l.put(102,"C"); HashMapDemo t=new HashMapDemo(); t.start(); for (Object o : l.entrySet()) { Object s=o; System.out.println(s); Thread.sleep(1000); } System.out.println(l); } } 输出:
100=A Exception in thread "main" java.util.ConcurrentModificationException
使用 ConcurrentHashMap
// Java program to illustrate // HashMap drawbacks import java.util.HashMap; import java.util.concurrent.*; class HashMapDemo extends Thread { static ConcurrentHashMap
l = new ConcurrentHashMap (); public void run() { // Child add new element in the object l.put(103,"D"); try { Thread.sleep(2000); } catch(InterruptedException e) { System.out.println("Child Thread going to add element"); } } public static void main(String[] args) throws InterruptedException { l.put(100,"A"); l.put(101,"B"); l.put(102,"C"); HashMapDemo t=new HashMapDemo(); t.start(); for (Object o : l.entrySet()) { Object s=o; System.out.println(s); Thread.sleep(1000); } System.out.println(l); } } 输出:
100=A 101=B 102=C 103=D {100=A, 101=B, 102=C, 103=D}
- 在 HashMap 中,key 和 values 允许为 null 值,而在 ConcurrentHashMap 中,key 和 value 不允许为 null 值,否则我们将得到 Run-time 异常NullPointerException。
使用哈希映射
//Java Program to illustrate ConcurrentHashMap behaviour import java.util.*; class ConcurrentHashMapDemo { public static void main(String[] args) { HashMap m=new HashMap(); m.put(100,"Hello"); m.put(101,"Geeks"); m.put(102,"Geeks"); m.put(null,"World"); System.out.println(m); } }
输出:
{null=World, 100=Hello, 101=Geeks, 102=Geeks}
使用 ConcurrentHashMap
//Java Program to illustrate HashMap behaviour import java.util.concurrent.*; class ConcurrentHashMapDemo { public static void main(String[] args) { ConcurrentHashMap m=new ConcurrentHashMap(); m.put(100,"Hello"); m.put(101,"Geeks"); m.put(102,"Geeks"); m.put(null,"World"); System.out.println(m); } }
输出:
Exception in thread "main" java.lang.NullPointerException
- HashMap 是在 JDK 1.2 中引入的,而 ConcurrentHashMap 是由 SUN Microsystem 在 JDK 1.5 中引入的。