TreeMap还是HashMap更快?

11 浏览
0 Comments

TreeMap还是HashMap更快?

本问题已经有答案::

HashMap、LinkedHashMap和TreeMap的区别

HashMap和TreeMap的区别?[重复]

我正在编写一个字典,它在Map <String,Index> 中大量使用String作为键。我的关注点是在地图中搜索键的 HashMap TreeMap 哪一个会导致更好(更快)的性能?

admin 更改状态以发布 2023年5月20日
0
0 Comments

public class MapsInvestigation {
public static HashMap hashMap = new HashMap();
public static TreeMap treeMap = new TreeMap();
public static ArrayList list = new ArrayList();
static {
    for (int i = 0; i < 10000; i++) {
        list.add(Integer.toString(i, 16));
    }
}
public static void main(String[] args) {
    System.out.println("Warmup populate");
    for (int i = 0; i < 1000; i++) {
        populateSet(hashMap);
        populateSet(treeMap);
    }
    measureTimeToPopulate(hashMap, "HashMap", 1000);
    measureTimeToPopulate(treeMap, "TreeMap", 1000);
    System.out.println("Warmup get");
    for (int i = 0; i < 1000; i++) {
        get(hashMap);
        get(treeMap);
    }
    measureTimeToContains(hashMap, "HashMap", 1000);
    measureTimeToContains(treeMap, "TreeMap", 1000);
}
private static void get(Map map) {
    for (String s : list) {
        map.get(s);
    }
}
private static void populateSet(Map map) {
    map.clear();
    for (String s : list) {
        map.put(s, s);
    }
}
private static void measureTimeToPopulate(Map map, String setName, int reps) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < reps; i++) {
        populateSet(map);
    }
    long finish = System.currentTimeMillis();
    System.out.println("Time to populate " + (reps * map.size()) + " entries in a " + setName + ": " + (finish - start));
}
private static void measureTimeToContains(Map map, String setName, int reps) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < reps; i++) {
        get(map);
    }
    long finish = System.currentTimeMillis();
    System.out.println("Time to get() " + (reps * map.size()) + " entries in a " + setName + ": " + (finish - start));
}
}

得到以下结果:

Warmup populate
Time to populate 10000000 entries in a HashMap: 230
Time to populate 10000000 entries in a TreeMap: 1995
Warmup get
Time to get() 10000000 entries in a HashMap: 140
Time to get() 10000000 entries in a TreeMap: 1164

0
0 Comments

考虑到碰撞并不多,哈希图会给您提供o(1)的性能(如果有很多碰撞,这可能会降级到O(n),其中n是任何单个桶中的条目(碰撞)的数量)。另一方面,如果您想要一些平衡树结构,可以使用TreeMaps,它的检索复杂度为O(logN)。因此,这真的取决于您特定的用例。但是如果您只想访问元素而不考虑它们的顺序,请使用HashMap

0