ConcurrentHashMap.get() 迭代器
ConcurrentHashMap.get() Iterator
我正在尝试检索 java 中已填充的 ConcurrentHashMap 中的键子集。附加的示例代码用于迭代指定元素的 get 方法,但我的问题是迭代 get 是否实际上是 ConcurrentHashMap 的最有效使用?
这个实现似乎与普通的 HashMap 没有什么不同 - 并发是自动内置的吗?有没有更快的方法 return 键子集的所有元素?
研究了 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));
}
}
}
代码输出正确。不过好像没有"concurrent"。想知道这是否自动成为一个有效的实施,或者会是什么。
来自javadoc:
A hash table supporting full concurrency of retrievals and high expected concurrency for updates.
因此:你的误解。 ConcurrentHashMap 以并行或 multi-threaded 方式自行 什么都不做 。
简单来说就是一个Map实现,可以多线程并行使用。普通的 HashMap ... 不能(好吧:当然你可以 read/write 并行到一个 HashMap,但是你会受到竞争条件和当多个线程在一个容器上运行时出现的所有潜在问题的影响'实施采取必要的预防措施)。
长话短说:ConcurrentHashMap 不会 做您假设的事情。
根据 OP 的评论进行编辑:
是的,你是对的,没有 API,在 Map 接口中,HashMap 或 ConcurrentHashMap 都没有提供特定的方法来以某种方式检索 子集 keys/values,或键+值对。您只能检索 keySet()
、values()
或 entrySet()
作为一个整体。然后你必须迭代那些来收集你想要的东西,或者扔掉你不想要的东西。
我正在尝试检索 java 中已填充的 ConcurrentHashMap 中的键子集。附加的示例代码用于迭代指定元素的 get 方法,但我的问题是迭代 get 是否实际上是 ConcurrentHashMap 的最有效使用?
这个实现似乎与普通的 HashMap 没有什么不同 - 并发是自动内置的吗?有没有更快的方法 return 键子集的所有元素?
研究了 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));
}
}
}
代码输出正确。不过好像没有"concurrent"。想知道这是否自动成为一个有效的实施,或者会是什么。
来自javadoc:
A hash table supporting full concurrency of retrievals and high expected concurrency for updates.
因此:你的误解。 ConcurrentHashMap 以并行或 multi-threaded 方式自行 什么都不做 。
简单来说就是一个Map实现,可以多线程并行使用。普通的 HashMap ... 不能(好吧:当然你可以 read/write 并行到一个 HashMap,但是你会受到竞争条件和当多个线程在一个容器上运行时出现的所有潜在问题的影响'实施采取必要的预防措施)。
长话短说:ConcurrentHashMap 不会 做您假设的事情。
根据 OP 的评论进行编辑:
是的,你是对的,没有 API,在 Map 接口中,HashMap 或 ConcurrentHashMap 都没有提供特定的方法来以某种方式检索 子集 keys/values,或键+值对。您只能检索 keySet()
、values()
或 entrySet()
作为一个整体。然后你必须迭代那些来收集你想要的东西,或者扔掉你不想要的东西。