我有一个CuncurrentHasMap:
private static ConcurrentHashMap<String, Object> testParameters =
new ConcurrentHashMap<String, Object>();我用相同的键推(有时)对象,这些对象是TreeMaps类型的TreeMap(string,MyPrivateClass)。
如何更改这个put方法,以便将具有相同键的对象放在一起而不被重写?
public static void put(String key, Object object) {
getTestParameters().put(key, object);
}发布于 2018-11-26 13:54:35
正如您在注释中指出的,新的TreeMap类型值应该是合并的和现有的,您可以重写字段和put方法,如下所示:
private static final Map<String, Map<String, MyPrivateClass>> testParameters = new ConcurrentHashMap<>();
public static void put(String key, TreeMap<String, MyPrivateClass> value) {
testParameters.compute(key, (k,v) -> {
if(null == v) {
v = Collections.synchronizedMap(new TreeMap<>(value.comparator()));
}
v.putAll(value);
return v;
}
);
}ConcurrentHashMap的使用表明您将从多个线程并发访问映射,这就是为什么我添加了Collections.synchronizedMap(),因为您可能还希望对结果的TreeMaps并发执行读取。
更新:在仍然维护TreeMaps条目的同时,我从computeIfAbsent切换到compute,就像AndyTurner在他的回答中所做的那样,因为我以前的方法不是原子的。
发布于 2018-11-26 11:54:13
使值List<Object> (或其他容器/集合类型)代替Object
private static ConcurrentHashMap<String, List<Object>> testParameters =
new ConcurrentHashMap<>();然后使用compute而不是put创建并添加到列表中:
getTestParameters().compute(key, (k, v) -> {
if (v == null) v = new ArrayList<>();
v.add(object);
return v;
});发布于 2018-11-26 11:57:46
如果这是可以接受的,您可以使用Multimap的实现。它可以存储单个键的多个值。由于看起来您需要一个线程安全的Map,所以我将使用Multimaps.synchronizedMultimap法并执行如下操作:
Multimap<String, Object> multimap = HashMultimap.create();
Multimap synchronizedMultimap = Multimaps.synchronizedMultimap(multimap);https://stackoverflow.com/questions/53480488
复制相似问题