JAVA HashMap、数组内存对比
1. 背景
程序中批量作业, 为了加快执行速度, 内存存储了一千多万用户数据. 之前使用HashMap, 服务内存扩充到了64G. 由于用户ID是自增字段, 打算切换成数组保存数据.
2. 比较
public class TestMapArray {
public static void main(String[] args) {
Long[] longs = testArr();
Map<Integer, Long> map = testMap();
while(true){
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private static Map<Integer, Long> testMap() {
Random random = new Random();
Map<Integer, Long> map = new HashMap<>(10_000_000);
for(Integer i = 0; i<10_000_000; i++){
map.put(i, random.nextLong());
}
System.out.println(map.size());
return map;
}
private static Long[] testArr(){
Long[] arr = new Long[10_000_000];
// Long[] arr = new Long[50_000_000];
Random random = new Random();
for(Integer i = 0; i<10_000_000; i++){
arr[i] = random.nextLong();
}
System.out.println(arr.length);
return arr;
}
}
-
map
使用内存约780M
-
数组使用内存约309M
由于存在无效的用户id, 当把数组长度定义为5千万时,使用内存约453M
3. 结论
数组替换哈希表可以至少省一半内存