9

我在网上遇到了一个算法http://www.coderanch.com/t/201836/Performance/java/Hashtable-vs-Hashmap 并决定测试它

public class MapTest{
    static int sizeOfTrial = 100000;
    static String[] keys = new String[sizeOfTrial];
    static String[] vals = new String[sizeOfTrial];

    public static void main(String[] args) {
        //init sizeOfTrial key/value pairs
        for (int i=0; i < sizeOfTrial; i++){
          String s1 = "key"+ i;
          String s2 = "val"+ i;
          keys[i] = s1;
          vals[i] = s2;
        }
        test(new TreeMap(), "TreeMap");
        test(new Hashtable(), "Hashtable");
        test(new HashMap(), "HashMap");
        test(new Hashtable(200000), "Hashtable presized");
        test(new HashMap(200000), "HashMap presized");
    }

  public static void test(Map tm, String name){
    long t1 = System.currentTimeMillis();
    for (int i=0; i < sizeOfTrial; i++){
      tm.put(keys[i],vals[i]);
    }
    for (int i=0; i < sizeOfTrial; i++){
      tm.get(keys[i]);
    }
    long t2 = System.currentTimeMillis();
    System.out.println("total time for " + name + ": " + (t2-t1));
  }
}

我得到了以下结果

total time for TreeMap: 1744
total time for Hashtable: 446
total time for HashMap: 234
total time for Hashtable presized: 209
total time for HashMap presized: 196

这个 JVM 是独立的和任意的,还是真的提供了更快的访问和存储时间?

4

1 回答 1

10

预定义任何容器类型类的预期大小将提供更快的存储时间,这仅仅是因为存储不必经常在运行时动态重新分配。通常后备存储是某种数组,当超出可用容量时,必须将数组复制到一个新的更大的数组中。如果您将大量对象存储到以非常小的容量启动的容器中,这是一项代价高昂的操作,可能必须多次发生。

从地图读取的性能不应该受到任何影响。tm.put您可以通过将零件与零件分开计时来更好地证明这一点tm.get


编辑:为了进一步说明这一点,我将代码修改为tm.puttm.get. 这是我机器上的结果:

total time for TreeMap tm.put: 159
total time for TreeMap tm.get: 74
total time for Hashtable tm.put: 20
total time for Hashtable tm.get: 10
total time for HashMap tm.put: 42
total time for HashMap tm.get: 5
total time for Hashtable presized tm.put: 11
total time for Hashtable presized tm.get: 9
total time for HashMap presized tm.put: 6
total time for HashMap presized tm.get: 4

Hashtable请注意, regular 和 presized for之间的差异tm.put约为 2。类似地,HashMap常规大小和预置大小之间的差异是大约 7 个用于存储的因素。但是,从阅读方面来看,在这两种情况下,两者HashtableHashmap时间大致相同tm.get10 msvs 9 msforHashtable5 msvs 4 msfor HashMap)。另请注意,在预先确定的情况下,推杆和取球所花费的总时间大致相同。

于 2012-04-20T01:53:09.033 回答