Android的HashMap和ArrayMap对比

原理


原理就不详细说了,看看这个文章:Fun with ArrayMaps (Android Performance Patterns Season 3 ep1)
不过做完我下面的测试后,结论有所不同。

# 做了个性能测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

private void testHashMap(){
long start = System.currentTimeMillis();
Map<Integer, Integer> m = new HashMap();
for (int i = 0; i < 200000; i++){
m.put(i, i + 100);
}
Log.i("Map", "testHashMap 1 time used " + (System.currentTimeMillis() - start));

start = System.currentTimeMillis();
m = new HashMap();
for (int i = 0; i < 200000; i++){
m.get(i);
}
Log.i("Map", "testHashMap 2 time used " + (System.currentTimeMillis() - start));
}

private void testArrayMap(){
long start = System.currentTimeMillis();
Map<Integer, Integer> m = new ArrayMap<>();
for (int i = 0; i < 200000; i++){
m.put(i , i + 100);
}
Log.i("Map", "testArrayMap 1 time used " + (System.currentTimeMillis() - start));

start = System.currentTimeMillis();
m = new ArrayMap<>();
for (int i = 0; i < 200000; i++){
m.get(i);
}
Log.i("Map", "testArrayMap 2 time used " + (System.currentTimeMillis() - start));
}

测试结果


HashMap平均耗时363ms, ArrayMap平均耗时271ms,ArrayMap快了25%。

HashMap增加内存15M,ArrayMap增加内存12M,ArrayMap少增加20%。

HashMap『get()』查询耗时45ms,ArrayMap『get()』查询耗时48ms,ArrayMap慢10%左右

加大循环次数


把循环次数调大,大到100万,结果耗时内存上ArrayMap更加领先,『get()』的耗时ArrayMap反超了HashMap

HashMap增加初始化容量


HashMap构造函数加入初始化的容量后,速度有大量提升,不过仍然比不上ArrayMap。

1
Map<Integer, Integer> m = new HashMap(1000000);

结论


测试结果比文章中说的有不同,除了查询时量少的情况下ArrayMap比HashMap慢,数据量大时ArrayMap更快。put()的耗时、内存上面ArrayMap是全面优势。

文章作者: Vincent Zhong
文章链接: https://www.itvincent.net/2016/12/27/hashmap-arraymap/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 itVincent的博客