我(使用netbeans探测器)比较了一些java集合,发现ArrayIntList比平面阵列占用更多内存,即使你使用相同的初始容量创建它也是如此。根据其源代码,它只是在里面创建相同的数组。所以我不明白。
您可以在下面看到源代码。
class ProfileFlatArray {
public static void main(String[] args) throws InterruptedException {
final int LEN = 5000000;
int[] array = new int[LEN];
Random rand = new Random();
for (int i = 0; i < LEN; i++) {
array[i] = rand.nextInt();
}
Thread.sleep(2000);
for (int i = LEN - 1; i > LEN / 2; i--) {
array[i] = 0;
}
Thread.sleep(5000);
System.gc();
Thread.sleep(2000);
System.out.print(array[rand.nextInt(LEN / 2 - 2)]);
}
}
Joda:
class ProfileArrayIntList {
public static void main(String[] args) throws InterruptedException {
final int LEN = 5000000;
ArrayIntList array = new ArrayIntList(LEN);
Random rand = new Random();
for (int i = 0; i < LEN; i++) {
array.add(i, rand.nextInt());
}
Thread.sleep(2000);
for (int i = LEN - 1; i > LEN / 2; i--) {
array.removeIntAt(i);
}
array.optimize();
Thread.sleep(5000);
System.gc();
Thread.sleep(2000);
System.out.print(array.get(rand.nextInt(LEN / 2 - 2)));
}
}
答案 0 :(得分:1)
这是电话
的结果array.optimize();
通过首先分配较小尺寸的数组来压缩新数组。这导致内存凸起。然后旧的数组被GC编辑,这导致内存降低。所以在一天结束时optimize()
释放了一半的已用内存。