为什么创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个空间。