基本上,我有一些對象的數據結構,這個結構將被多個線程訪問,並且需要考慮這個結構。很多迭代和對象操作都需要不斷進行(每個主循環迭代都會導致數據結構中的每個對象在最壞的情況下被修改,而在最好/正常情況下不會修改)。ArrayList vs HashMap - 大量的迭代和對象操作
目前,我正在使用CopyOnWriteArrayList
作爲我的結構。此外,在每次迭代時,我都確保不添加重複項,以嘗試保持列表大小。
使用鎖定/ synchronized是不理想的,因爲我想避免阻止這些操作的線程。
據我所知道的,是我對這個選項如下:
- 運行檢查要添加
- 創建從列表中
HashSet
並將其轉換回每一個元素(主要是刪除所有重複項) - 使用
ConcurrentHashMap
而不是數據結構的列表 - 還有其他的東西嗎?
我知道ArrayLists
與迭代要好得多,而對象的操作和重複檢查更好地通過嚴格使用HashMap
處理。由於我的情況將需要兩個,我想知道什麼是最好的解決方案在這裏。
我還應該提到元素的排序是一個非問題。
編輯:爲了進一步說明這一點,該集合將不斷添加,刪除和修改元素。在多大程度上取決於每個特定的運行時間(基於一般的隨機事件),所以我對有多頻繁地做出任何假設都很謹慎。唯一保證發生的事情是集合將每次完全遍歷,對每個元素執行多次檢查。
如果您還需要快速唯一性檢查,則HashMap上的迭代並不特別差。我會說整個集合的ConcurrentHashMap。 – 2014-11-21 20:20:22
如果你所需要的只是一個集合,你也可以使用'Collections.newSetFromMap(new ConcurrentHashMap <>());' - 我不確定迭代在地圖vs列表上會更糟糕,這是值得檢查的。 – assylias 2014-11-21 20:27:14
我在STO上看到了一些其他線程,講述瞭如何通過ArrayList迭代平均迭代通過HashMap的鍵集的速度的3到4倍 – 2014-11-21 21:26:52