比较HashMap HashTable 和ConcurrentHashMap的效率.
一般情况下,达到一定的数量之后JDK1.5之后提供的ConcurrentHashMap集合类的效率是前两者的3~4倍左右.
前两种集合类的效率比较接近.
ConcurrentHashMapTest.java
1 import java.util.Collections; 2 import java.util.HashMap; 3 import java.util.HashSet; 4 import java.util.Hashtable; 5 import java.util.Map; 6 import java.util.concurrent.ConcurrentHashMap; 7 8 //测试三种并发集合的读写效率 9 public class ConcurrentHashMapTest { 10 11 public static void main(String[] args) { 12 //HashMap不是线程安全的,通过 Collections.synchronizedMap()转换成线程安全的. 13 final Map<Integer, Integer> hm = Collections.synchronizedMap(new HashMap<Integer, Integer>()); 14 //HashTable内部自带同步,线程安全的. 15 final Map<Integer, Integer> ht = new Hashtable<Integer, Integer>(); 16 //JDK1.5之后提供的并发集合. 17 final Map<Integer, Integer> chm = new ConcurrentHashMap<Integer, Integer>(); 18 putMap(hm);//输出:13321 19 putMap(ht);//输出:11834 20 putMap(chm);//输出:8312 数据量达到一定程度之后,会比前两种快3~4倍左右. 21 22 } 23 24 private static void putMap(final Map<Integer, Integer> hm) { 25 long begin = System.currentTimeMillis(); 26 for (int k = 0; k < 100; k++) {//为了让效果更明显,再循环100次. 27 for (int i = 0; i < 1000; i++) {//1000条线程 28 final int key = i; 29 new Thread(new Runnable() { 30 @Override 31 public void run() { 32 for (int j = 0; j < 1000; j++) {//每条线程向其中添加1000次 33 hm.put(key, j); 34 } 35 } 36 }).start(); 37 } 38 } 39 long end = System.currentTimeMillis(); 40 System.out.println(end - begin); 41 } 42 }