java map对象的效率比较

  1. import static java.lang.System.out;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.HashMap;
  5. import java.util.Hashtable;
  6. import java.util.IdentityHashMap;
  7. import java.util.Iterator;
  8. import java.util.LinkedHashMap;
  9. import java.util.LinkedList;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.Stack;
  13. import java.util.TreeMap;
  14. import java.util.Vector;
  15. import java.util.WeakHashMap;
  16. import java.util.concurrent.ConcurrentHashMap;
  17. import java.util.concurrent.CopyOnWriteArrayList;
  18. import org.apache.commons.collections.FastArrayList;
  19. import org.apache.commons.collections.list.TreeList;
  20. import org.apache.commons.lang.StringUtils;
  21. import org.apache.commons.lang.time.StopWatch;
  22. @SuppressWarnings("unchecked")
  23. public class MapPerformance {
  24. public static void main(String[] args) {
  25. MapPerformance test = new MapPerformance(10 * 10000);
  26. out.print(StringUtils.center("Test Map Performance: loop=" + test.loop, 80, '-'));
  27. out.printf("\n sssssss", "", "put", "put", "remove", "get",
  28. "iterator","for");
  29. test.benchmark(new HashMap());
  30. test.benchmark(new Hashtable());
  31. test.benchmark(new LinkedHashMap());
  32. test.benchmark(new IdentityHashMap());
  33. test.benchmark(new TreeMap());
  34. test.benchmark(new WeakHashMap());
  35. test.benchmark(new ConcurrentHashMap());
  36. }
  37. private int loop = 10000;
  38. public MapPerformance(int loop) {
  39. this.loop = loop;
  40. }
  41. public void benchmark(Map map) {
  42. out.printf("\n s", map.getClass().getSimpleName());
  43. int j;
  44. StopWatch watch = null;
  45. //1.测试顺序性能(Add)
  46. (watch = new StopWatch()).start();
  47. for (int i = 0; i < loop; i++) {
  48. map.put(i, i);
  49. }
  50. watch.stop();
  51. out.printf("d", watch.getTime());
  52. //2.测试随机插入性能(Random insert)
  53. (watch = new StopWatch()).start();
  54. for (int i = 0; i < loop; i++) {
  55. j = (int) (Math.random() * loop);
  56. map.put(j, new Integer(-j));
  57. }
  58. watch.stop();
  59. out.printf("d", watch.getTime());
  60. //3.测试随机索引删除(Random remove)
  61. (watch = new StopWatch()).start();
  62. for (int i = 0; i < loop; i++) {
  63. j = (int) (Math.random() * loop);
  64. map.remove(j);
  65. }
  66. watch.stop();
  67. out.printf("d", watch.getTime());
  68. //4.测试随机取数性能(Random get)
  69. (watch = new StopWatch()).start();
  70. for (int i = 0; i < loop; i++) {
  71. j = (int) (Math.random() * loop);
  72. map.get(j);
  73. }
  74. watch.stop();
  75. out.printf("d", watch.getTime());
  76. //6.测试迭代性能(Iterator)
  77. (watch = new StopWatch()).start();
  78. Iterator<Object> iter = map.values().iterator();
  79. while (iter.hasNext()) {
  80. iter.next();
  81. }
  82. watch.stop();
  83. out.printf("d", watch.getTime());
  84. //7.测试迭代性能(Iterator)
  85. (watch = new StopWatch()).start();
  86. // Iterator<Object> iter = list.iterator();
  87. for (Object obj : map.values()) {
  88. }
  89. watch.stop();
  90. out.printf("d", watch.getTime());
  91. }
  92. }

结果:

-----------------------Test Map Performance: loop=100000------------------------
put random-put remove get iterator for
HashMap 47 94 78 47 0 0
Hashtable 141 78 78 62 0 16
LinkedHashMap 125 78 94 47 0 0
IdentityHashMap 172 265 47 63 15 16
TreeMap 94 125 187 109 0 0
WeakHashMap 156 250 47 31 0 16
ConcurrentHashMap 94 140 79 46 0 16

结论:

1、HashMap的性能比较高,但不是线程安全的

2、ConcurrentHashMap的put性能没有HashMap的高,get的性能与HashMap一样或者略高于,但是是线程安全的

  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓