![](/img/trans.png)
[英]NullPointerException when attempting ConcurrentHashMap.get()
[英]ConcurrentHashMap.get() Iterator
我正在嘗試在 java 中已填充的 ConcurrentHashMap 中檢索鍵的子集。 附加的示例代碼用於迭代指定元素的 get 方法,但我的問題是關於 get 迭代是否實際上是 ConcurrentHashMap 的最有效使用?
這個實現似乎與普通的 HashMap 沒有什么不同——並發是自動內置的嗎? 有沒有更快的方法來返回鍵子集的所有元素?
查看 entrySet() 方法,但我沒有將數據輸入到地圖中,它是預先存在的。 還查看了 forEach(),但它似乎不接受完整地圖的子集。
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapgetExample1 {
public static void main(String[] args)
{
ConcurrentHashMap<Integer, String> maphash = new
ConcurrentHashMap<Integer, String>();
maphash.put(1, "AA");
maphash.put(2, "BB");
maphash.put(3, "CC");
maphash.put(4, "DD");
maphash.put(5, "EE");
int[] keySubSet = {1, 2, 3};
System.out.println("mappings are: " + maphash);
for (int i = 1; i < keySubSet.length + 1; i++){
System.out.println(" Value : " + maphash.get(i));
}
}
}
代碼輸出正確。 但它似乎並不“並發”。 想知道這是否自動是一個有效的實現,或者會是什么。
從javadoc :
一個哈希表,支持檢索的完全並發和更新的高預期並發。
因此:對你的誤解。 即ConcurrentHashMap做並行或多線程的方式本身沒什么。
它只是一個 Map 實現,可以被多個線程並行使用。 普通的 HashMap ... 不能(好吧:當然,您可以並行讀取/寫入 HashMap,但是您會受到競爭條件的影響以及當多個線程在不支持的容器上運行時出現的所有潛在問題)采取必要的預防措施)。
長話短說:即ConcurrentHashMap不會做你認為它做什么。
編輯,鑒於 OP 的評論:
是的,您是對的,Map 接口中沒有 API,HashMap 或 ConcurrentHashMap 也沒有提供特定方法來以某種方式檢索鍵/值或鍵+值對的子集。 您只能整體檢索keySet()
、 values()
或entrySet()
。 然后你必須迭代這些來收集你想要的東西,或者扔掉你不想要的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.