我有一個Android應用程序,其核心組件是HashMap<String,float[]>.
該系統具有較高的併發性。 e.g 這裏有以下三種情況下,我都經常發生,他們是通過HashMap的所有鍵在本質上高效使用ConcurrentHashMap?
- 迭代高度重疊,並做 它的值(只讀操作)一些操作。
- 在Hashmap中添加新的鍵值對。
- 從哈希圖中刪除某些密鑰。
我做的所有這些操作在不同的線程,從而正在使用的ConcurrentHashMap ,因爲在檢索一些不一致事犯規。例如迭代地圖時,如果添加了新條目,那麼不必立即讀入這些新值,因爲我確保下次讀取這些新值。
而且同時去除的條目,我重新創建迭代器每次以避免「ConcurrentModificationException的」
假設,有以下的HashMap(即一個ConcurrentHashMap)
ConcurrentHashMap<String,float[]> test=new ConcurrentHashMap<String, float[]>(200);
現在對於檢索我做以下
Iterator<String> reader=test.keySet().iterator();
while(reader.hasNext())
{
String s=reader.next();
float[] temp=test.get(s);
//do some operation with float[] temp here(read only operation)
}
和去除我下面
boolean temp = true;
while (temp) {
for (String key : test.keySet()) {
temp = false;
if (key.contains("abc")) {
test.remove(key);
temp = true;
break;
}
}
}
,並在新值插入時,我只是做
test.put("temp value", new float[10]);
我不知道,如果它是一個非常有效的利用。另外,不要讀取已刪除的值(但是我需要效率,並且由於在函數調用期間再次創建了迭代器,它保證了在下次我不會獲取刪除的值),因此可能會產生很多不一致容忍?
請問有人能告訴我一個有效的方法嗎?
PS。我忘了提到爲什麼我以這種方式進行清除操作。 我現在已經改變了上其從等於刪除,包含(有可能是具有前綴「ABC」,然後不同的後綴多刺的條件。所以我需要刪除所有這些呢。
迭代整個地圖以刪除一個條目肯定效率不高。你爲什麼不直接調用remove(「abc」)? – EJP
是的,哎呀,我現在已經將刪除條件更改爲包含.. –
不,您應該將整個塊更改爲只需一次調用remove()。你不需要別的東西,我不明白你爲什麼會這麼想。 -1 – EJP