Java HashMap和ConcurrentHashMap的区别
HashMap是传统集合中的一个类,而ConcurrentHashMap是并发集合中的一个类,除此之外,它们之间还有很多不同之处。
- HashMap在本质上是非同步的,即HashMap不是线程安全的,而ConcurrentHashMap在本质上是线程安全的。
- HashMap的性能相对较高,因为它在本质上是非同步的,任何数量的线程都可以同时执行。但是ConcurrentHashMap的性能有时很低,因为有时线程需要在ConcurrentHashMap上等待。
- 当一个线程在迭代HashMap对象时,如果其他线程试图添加/修改对象的内容,那么我们会得到运行时异常,即ConcurrentModificationException。而在ConcurrentHashMap中,当在迭代时进行任何修改时,我们不会得到任何异常。
使用 HashMap
// Java program to illustrate
// HashMap drawbacks
import java.util.HashMap;
class HashMapDemo extends Thread
{
static HashMap<Integer,String> l=new HashMap<Integer,String>();
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<Integer,String> l =
new ConcurrentHashMap<Integer,String>();
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中,键和值允许为空值,而在ConcurrentHashMap中,键和值不允许为空值,否则我们会得到运行时异常 NullPointerException。
使用HashMap
//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中引入的。