![](/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.