2014-11-21 57 views
3

基本上,我有一些對象的數據結構,這個結構將被多個線程訪問,並且需要考慮這個結構。很多迭代和對象操作都需要不斷進行(每個主循環迭代都會導致數據結構中的每個對象在最壞的情況下被修改,而在最好/正常情況下不會修改)。ArrayList vs HashMap - 大量的迭代和對象操作

目前,我正在使用CopyOnWriteArrayList作爲我的結構。此外,在每次迭代時,我都確保不添加重複項,以嘗試保持列表大小。

使用鎖定/ synchronized是不理想的,因爲我想避免阻止這些操作的線程。

據我所知道的,是我對這個選項如下:

  1. 運行檢查要添加
  2. 創建從列表中HashSet並將其轉換回每一個元素(主要是刪除所有重複項)
  3. 使用ConcurrentHashMap而不是數據結構的列表
  4. 還有其他的東西嗎?

我知道ArrayLists與迭代要好得多,而對象的操作和重複檢查更好地通過嚴格使用HashMap處理。由於我的情況將需要兩個,我想知道什麼是最好的解決方案在這裏。

我還應該提到元素的排序是一個非問題。

編輯:爲了進一步說明這一點,該集合將不斷添加,刪除和修改元素。在多大程度上取決於每個特定的運行時間(基於一般的隨機事件),所以我對有多頻繁地做出任何假設都很謹慎。唯一保證發生的事情是集合將每次完全遍歷,對每個元素執行多次檢查。

+0

如果您還需要快速唯一性檢查,則HashMap上的迭代並不特別差。我會說整個集合的ConcurrentHashMap。 – 2014-11-21 20:20:22

+1

如果你所需要的只是一個集合,你也可以使用'Collections.newSetFromMap(new ConcurrentHashMap <>());' - 我不確定迭代在地圖vs列表上會更糟糕,這是值得檢查的。 – assylias 2014-11-21 20:27:14

+0

我在STO上看到了一些其他線程,講述瞭如何通過ArrayList迭代平均迭代通過HashMap的鍵集的速度的3到4倍 – 2014-11-21 21:26:52

回答

1

這個答案解決您的併發性的擔憂:

很多迭代和對象操作將需要不斷執行(每次主循環迭代可能會導致在數據結構中的每一個對象被修改最壞的情況下,最好/正常情況下沒有任何修改)。

該集合是否會被修改?如果不是隻選擇哪個集合最有意義並且在對象上同步。一旦它們進入集合中,您將不會從CopyOnWriteArraylistConcurrentHashMap獲得同步優勢。

如果收集將被修改後續是多久?

如果很多不使用CopyOnWriteArrayList。如果有一點,然後根據最高的搜索性能選擇。

+0

嗯,這並沒有完全回答它,但感謝至少嘗試。你會得到最好的答案。 – 2014-11-26 18:34:54