2012-06-14 25 views
1

Hi there Stackoverflowers!在Java中訪問/修改的最快數據結構

我的編碼項目時,我不知道這是最快的數據結構,讓我最好的表現,如果我要訪問/修改了大量的數據?

讓我來舉個例子來解釋。 我有一個叫做User和一個類事件的類。用戶可以有很多事件。到現在爲止,我已經實現了用一個ArrayList這種情況:

public class User{ 
    ArrayList<Event> events; 
    public void process(){ 
    } 
    ... 
} 
public class Event{ 
    event data like event time etc. 
} 

因爲我有很多的用戶(百萬),每個用戶都可以有潛在的數千個事件,此外,我要訪問的每一個事件一個使用process()方法的用戶,我認爲使用像HashMaps等結構不會有幫助(如果我錯了,請告訴我)。 然而,很明顯,有了這樣的元素數量,良好的性能是一個需求。

那麼,您認爲處理事件的最快數據結構是什麼?

非常感謝,

Marco。

+2

取決於您希望如何處理事件。訂單是否重要?如果是這樣,它是FIFO還是LIFO數據結構? – m0skit0

+0

我寧願將它委託給數據庫 – LeleDumbo

+0

我同意LeleDumbo,如果你有數百萬的用戶,它只需要一個數據庫... – alegen

回答

3

這聽起來似乎更適合於數據庫的工作,特別是如果你想持久性和/或您的數據可能不適合您的計算機的主存儲器。

但是,如果你堅持在自己的代碼這樣做,你可能想看看LinkedHashMap類。它允許以恆定的(即O(1))複雜度直接訪問其元素,同時還組合內部鏈表以允許對所有元素進行快速迭代。

當然,一個HashMap結構是否有用取決於你想要做什麼。例如,如果您想根據某種標識符搜索事件,那麼HashMap是理想的。另一方面,如果您只需要根據其插入順序訪問事件,那麼您不會比ArrayList做得更好,因爲它支持對其內容進行索引訪問並且具有固定的複雜性。如果您只需要在隊列或堆棧中處理它們,則Java有幾個可能會讓您感興趣的接口實現。

最後,如果你想隨機插入你的鑰匙,並有底層結構排序他們本身,你可能會發現TreeMap類有用。

+0

我不認爲使用數據庫可以解決性能問題。如果我使用數據庫,是否還有一個額外的性能問題來源於需要從中檢索數據? 我的意思是,如果我訪問我的機器上的數據而不是數據庫,它應該真的更快。 是不是? –

+0

@MarcoGalassi:1.您始終可以在同一主機上運行數據庫。 2.你確定你的數據總是適合可用內存嗎?如果你打算使用磁盤,最好讓數據庫來做 - 它會比你更好。 3.你的持久性和一致性要求是什麼?你需要交易嗎?當程序終止時會發生什麼。如果崩潰會發生什麼? – thkala

+0

@MarcoGalassi:我忘了最重要的論點:在實際嘗試應用程序之前,您似乎假設存在性能問題。不成熟的優化是所有惡魔的母親 - 在探查器告訴你之前,不會優化任何事情...... – thkala

1

有兩件事情:

在當前情況下1年,如果併發用戶是不是一個問題,那麼你可以很容易地去的ArrayList作爲其更快的簡單的數據結構否則,如果併發用戶的關注,那麼你可以很容易地去向量來存儲你的事件。

2 - 您可以使用隊列DS,這將有助於你在像插入/刪除這是更快然後ArrayList和vecotr,因爲它使用迭代器動態操作。

我希望它有幫助。

0

如果你的數據適合主內存,你最好的辦法是Java集合和 平原陣列(取決於隨機訪問,順序性的需求,需要持續的變化或任何其他)如果你的數據的增長過去單一的系統內存的使用某些可集羣化的無sql解決方案將會有更好的性能(同樣,正確的工具 的選擇取決於您喜歡用什麼數據處理)