话不多说, 先给大家看段代码, 如果嫌麻烦, 可以直接跳到末尾看结论.
public static void main(String[] args) {
long start = 0;
long end = 0;
// 获取虚拟机运行时空闲内存
start = Runtime.getRuntime().freeMemory();
// 创建一个 HashMap 对象, 同理也可以测试 List , Set 以及 数组
HashMap<String, Integer> map = new HashMap<>();
// 添加元素
for (int i = 0; i < 8000; i++) {
map.put("test"+i, i*i);
}
// 获取添加元素后, 虚拟机运行时的空闲内存 .
end = Runtime.getRuntime().freeMemory();
// 结论
System.out.println("HashMap 共占内存 " + (start - end) + " 个字节.");
}
1.当HashMap为空时, 不添加任何元素的时候.
/*for (int i = 0; i < 8000; i++) {
map.put("test"+i, i*i);
}*/
运行结果为:
HashMap 共占内存 0 个字节.
2. 在 HashMap 不为空的时候 , 分别添加 1 个元素, 10 个元素 , 100 个元素 , 1000 个 元素 , 1000 个元素 的时候.
// 1 个元素的时候 HashMap 共占内存 0 或 1342200 个字节 .
// 10 个元素的时候 HashMap 共占内存 0 或 1342200 个字节 .
// 100 个元素的时候 HashMap 共占内存 1342200 个字节 .
// 1000 个元素的时候 HashMap 共占内存 1342200 个字节 .
// 10000 个元素的时候 HashMap 共占内存 2684376 个字节 .
for (int i = 0; i < 10000 ; i++) {
map.put("test"+i, i*i);
}
3. 测试其具体临界值, 第一次所占内存翻倍
当元素个数为 6400 的时候
for (int i = 0; i < 6400 ; i++) {
map.put("test"+i, i*i);
}
## 所占系统内存为
HashMap 共占内存 1342200 个字节.
当元素个数为 6500 的时候
for (int i = 0; i < 6500 ; i++) {
map.put("test"+i, i*i);
}
## 所占系统内存为
HashMap 共占内存 2684400 个字节.