1
我比較了一些java集合,並發現ArrayIntList需要更多內存比平面陣列,即使您創建它具有相同的初始容量。根據它的源代碼,它只是在裏面創建相同的數組。所以我不明白。joda ArrayIntList(5000000)vs int [5000000]內存消耗
您可以在下面看到源代碼。
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)]);
}
}
而且喬達:
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)));
}
}
我認爲它會調整一定量的添加以保持O(1)攤銷插入時間。所以列表的容量可能比你的初始種子大。編輯我見過你的'優化',所以從頭開始配置。 –
我不知道。我試圖調試這個東西,但沒有-g選項編譯的joda-primitives。 –
我已經檢查出內部數組的長度總是等於LEN。 –