2014-01-09 57 views
3

我試圖加載超過2^32個元素的數據集,並把這些元素在一個ArrayList anArrayList到ArrayList中。此數據按時間順序排列,因此我使用ArrayList來存儲數據以保持順序。同時,我想快速訪問String elementID中的元素。現在我使用HashMap將elementID映射到anArrayList中的元素Object。 我用一個整數currentAddingAt來跟蹤anArrayList上的索引來添加元素。下面是相關的代碼:加載大數據集的Java(ArrayList中的最大容量)

ArrayList<ElementX> anArrayList; 
int currentAddingAt; 
HashMap<String, ElementX> elementToObjHashMap; 

... ... 

public void addAnElement(ElementX e){ 
    anArrayList.add(currentAddingAt, e); 
    elementToObjHashMap.put(e.getElementID, ArrayList.get(currentAddingAt)); 
} 

當我改變的currentAddingAt類型從intlong的問題就來了。根據Oracle的文檔(http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html),ArrayList的get(int index)方法僅以int作爲參數。這也讓我疑惑:

能ArrayList中的能力比在Java中(2^32)最大INT編號更大?

有什麼選擇比在這種情況下使用的ArrayList和HashMap(保持一個大型數據集的順序,仍然有能力擺脫一鍵快速對象映射)其他?我需要一些庫(甚至是一些框架),然後是普通的Java嗎?

+1

您可以切換到一個LinkedList實現克服的ArrayList Integer.MAX_VALUE的尺寸問題,但有可能是,而不是一種更好的方式加載整個數據在內存中。 – gipinani

+0

此鏈接可能會給你一些想法 - [鏈接](http://stackoverflow.com/questions/15630998/how-to-make-a-big-array-in-java) – jacquard

+0

什麼其他的策略有什麼建議,我可以使用?使用這些數據的方式是:讀取和寫入大部分這些元素中的信息以實時動態計算信息。某種數據庫是否會提供元素中數據快速獲取和修改的速度?謝謝。 – Bin

回答

5

ArrayList的容量能否大於Java中最大的int數(2^32)?

不是。因爲它是數組支持的,所以它不能大於2^31-1。如果您想要size()toArray()方法工作,這適用於所有Collections

你需要存儲列表的列表,但我敢打賭,有能做到這一點的庫。我沒有使用它的那部分,但是除了它的原始數據結構之外,還有Fastutil has big data structures