2012-04-16 48 views
0

我沒有那種Java(但學習)數據結構的經驗,並不確定要選擇什麼類型的列表。我的問題是我正在創建一個套接字服務,它接收數據並根據列表對其進行檢查,如果它不存在,那麼它會傳遞要處理的數據並將數據ID號添加到列表中,以便相同的數據不會再次處理(處理數據的服務不知道是否存在重複的工作,所以這是作爲過濾器)。不確定哪種類型的清單要選擇?

我看到ArrayList速度很快,但我只是意識到它需要我知道列表的大小,而不是隨着它的不斷增長(它肯定會觸及數十億個物品)。我以爲我會用舊的時尚整數[],但認爲我會問是否有更好的方法。

有幾個細節與我的過程有關,我的數據本身很複雜,但對於查找,我將數據轉換爲散列碼並檢查這些數據以便我所有的數據都是整數(正數/負數)以及客戶端請求是通過可運行的程序來完成的,所以如果我能做些事情來提高數據的效率,我可以做到這一點(我在想,因爲它的所有Integers可能經常對它進行排序以使循環更快?)。是整數[]足夠好還是有更好的?

+1

我希望它不會超過2,147,483,647項。那麼你會遇到比選擇哪種類型的列表更大的問題。 – Jeffrey 2012-04-16 01:34:35

+0

@Jeffrey我會保持我的手指交叉它不:-) – Lostsoul 2012-04-16 01:35:16

+0

你應該使用一個Set而不是List來避免重複。 – Hassan 2012-04-16 01:38:41

回答

1

如果ID是數字或字符串,則可以使用HashSet<IDType>,其中IDType是ID的類型(例如int)。這確保了最佳搜索時間,並且每個元素僅存儲一次。

ArrayList也可以工作,但要搜索它,您將不得不遍歷整個列表(可能在最壞的情況下),比較每個元素。

2
it will surely hit several billion items 

我非常懷疑這一點。這將是千兆字節的數據。

如果你真的有數十億件物品,我建議把它們保存在數據庫而不是內存中。你當然可以在內存中緩存一個子集來加快查詢速度,但是長期的解決方案是一個數據庫,即使服務器出現故障,數據庫也會保留值。

用於檢查並查看ID是否存在的數據庫查詢僅花費毫秒。我認爲這比將它們存儲在內存中是一個更好的長期解決方案。

+0

堅持+1 – Korinna 2012-04-16 05:04:12

1

那麼,如果你想檢查寶貴的物品,那麼無論哪種方式,你將不得不存儲所有的物品。我會建議使用HaspMap。此外,如果可能不夠,您可以使用多個hashmaps

您可以輕鬆地做

if(map.containsKey(blah)) 
    //Do something 

使用一個以上的hashmap檢查,如果你認爲該項目可以基於什麼區別。這可能會更快。 此外,由於項目很大,我建議使用LinkedHashMap以及HashMap來做一些緩存。這將加速該過程,因爲LinkedHashMap會將經常出現的項目存儲在其優先級Q中。

1

如果您已經哈希數據,爲什麼不使用哈希集合中的一個例如HashSet或HashMap而不是列表?