为什么创build一个HashMap比创build一个Object 更快?

我试图构build自己的Map以增加特殊环境的性能,并且我意识到一些非常有趣的事情:创build一个new Hashmap<Integer,String>(2000)new Object[2000]快 – 无论在哪为了执行这些命令。 这对我来说很混乱,尤其是。 因为Hashmap构造函数包含一个table = new Entry[capacity] ,据此。 我的testing平台有问题吗?

 public static void test(int amm){ //amm=1_000_000 Map<Integer,String> m1 = null; Object[] arr = null; long time = System.nanoTime(); for(int i = 0; i < amm; i++){ m1 = new HashMap<Integer, String>(2000); } System.out.println("m1: " + (System.nanoTime() - time)); //m1: 70_455_065 time = System.nanoTime(); for(int i = 0; i < amm; i++){ arr = new Object[2000]; } System.out.println("arr: " + (System.nanoTime() - time)); //arr: 1_322_473_803 } 

我很想看到另一台电脑上的testing结果。 我不明白为什么创build一个HashMap比创buildObject[]快10倍。

如果你看一下HashMap的实现,构造函数如下所示:

 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; threshold = initialCapacity; init(); } 

init()看起来像:

 /** * Initialization hook for subclasses. This method is called * in all constructors and pseudo-constructors (clone, readObject) * after HashMap has been initialized but before any entries have * been inserted. (In the absence of this method, readObject would * require explicit knowledge of subclasses.) */ void init() { } 

所以initialCapacity实际上并不用于创build一个数组。 它在哪里被使用? 看看put()方法。

 public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } // hidden } 

当做一个put,数组实际上是创build。 我没有显示inflateTable()但它做了一些math和初始化数组。

一个空的HashMap对象比2000个Object引用数组要小得多。 即使您将2000传递给HashMap构造函数的initialCapacity参数,但实际上并没有为对象创build2000个空间。