我想将一百万个整数存储在数据结构中。我想知道 int 数组 (int[]) 是否比 ArrayList 更高效。与 ArrayList 相比,使用 int[] 是否有任何性能提升?我相信 ArrayList 使用的内存比 int[] 更多,但我不知道额外的内存是否可以忽略不计。
如果我增加数组的大小(从一百万到十亿个整数),答案会改变吗? ArrayList 使用的额外内存是否可以忽略不计?
默认情况下,ArrayList 的容量最多可达其所包含元素数量的两倍。然而,
ArrayList<Integer>
和int[]
之间的主要区别在于Integer
和int
之间的区别:Integer
是一个对象,每个对象存储JVM的一些元数据(运行时类型、身份哈希码、. ..),这使得它比普通的 int
. 稍大一些
此元数据的大小没有指定,并且可能会有所不同。您可以按如下方式测量:
public class Test {
private static long usedMemory() {
var r = Runtime.getRuntime();
return r.totalMemory() - r.freeMemory();
}
public static void main(String[] args) {
int elements = 10_000_000;
long start = usedMemory();
int[] data = new int[elements];
long end = usedMemory();
System.out.println("int[] used " + (double)(end - start) / data.length + " bytes per element");
start = usedMemory();
var list = new ArrayList<Integer>();
for (int i = 0; i < elements; i++) {
list.add(i);
}
end = usedMemory();
System.out.println("ArrayList<Integer> used " + (double)(end - start) / list.size() + " bytes per element");
}
}
在我的 JVM 上,打印:
int[] used 4.194304 bytes per element
ArrayList<Integer> used 26.1477176 bytes per element