Java 使用Map.putAll()时覆盖

Java 使用Map.putAll()时覆盖,java,hashmap,Java,Hashmap,我在使用Map.putAll()时遇到一些困难。它不是更新/添加特定记录到我的主地图,而是覆盖条目: ConcurrentMap<String, ConcurrentHashMap<CardType, Card>> cache = new ConcurrentHashMap<String, ConcurrentHashMap<CardType, Card>>(); ConcurrentMap缓存=新建ConcurrentHashMap();

我在使用Map.putAll()时遇到一些困难。它不是更新/添加特定记录到我的主地图,而是覆盖条目:

  ConcurrentMap<String, ConcurrentHashMap<CardType, Card>> cache = new ConcurrentHashMap<String, ConcurrentHashMap<CardType, Card>>();
ConcurrentMap缓存=新建ConcurrentHashMap();
三张单独的地图生成如下:

   ConcurrentMap<String, ConcurrentHashMap<CardType, Card>> businessCardCache = buildBusinesscardCacheValues(connection, getBusinessCards);
   ConcurrentMap<String, ConcurrentHashMap<CardType, Card>> personalCardCache = buildPersonalcardCacheValues(connection, getPersonalCards);
   ConcurrentMap<String, ConcurrentHashMap<CardType, Card>> socialCardCache = buildSocialcardCacheValues(connection, getSocialCard);
   cache.putAll(businessCardCache);
   cache.putAll(personalCardCache);
   cache.putAll(socialCardCache);
ConcurrentMap businessCardCache=buildBusinesscardCacheValues(连接,获取名片);
ConcurrentMap personalCardCache=buildPersonalcardCacheValues(连接,getPersonalCards);
ConcurrentMap socialCardCache=buildSocialcardCacheValues(连接,getSocialCard);
cache.putAll(businessCardCache);
cache.putAll(personalCardCache);
cache.putAll(socialCardCache);
例如,用户ben应该是钥匙,他应该有一张商务卡、一张个人卡和一张社交卡。事实上,他最终只得到了一张社交卡,因为我认为它是最后一张,因此覆盖了前一张

我应该如何修改它


谢谢

您当前初始化的
缓存
将导致
缓存.putAll(personalCardCache)
替换由
cache.putAll(businessCardCache)添加的值

如果希望
缓存
包含每个用户的所有卡(取自所有3个输入映射),则应以不同的方式对其进行初始化:

for (String key : businessCardCache.keySet()) {
    ConcurrentHashMap<CardType, Card> cards = null;
    if (cache.containsKey(key) {
        cards = cache.get(key);
    } else {
        cards = new ConcurrentHashMap<CardType, Card>();
    }
    cards.putAll (businessCardCache.get(key));
}
for(字符串键:businessCardCache.keySet()){
ConcurrentHashMap卡=空;
if(cache.containsKey(键){
cards=cache.get(key);
}否则{
cards=新的ConcurrentHashMap();
}
cards.putAll(businessCardCache.get(key));
}

然后对其他两个映射执行相同的操作。

似乎是正确的。您期望什么?映射
应该如何知道如何合并值?任何
put
操作都会替换映射(如果存在)。如果使用Java 8,您可以使用
merge
。否则您将需要自定义逻辑。
putAll
基本上调用
>put
用于每个条目。用于put的Javadocs:
将指定值与此映射中的指定键相关联(可选操作)。**如果映射以前包含键的映射,则旧值将替换为指定值。**(映射m称为包含键k的映射,当且仅当m.containsKey(k)将返回true。)
。因此,这是预期的行为——条目将被覆盖。您的源映射中有具有相同密钥提交的记录,这甚至不适用于简单的
映射#put(key,value)
,在执行put之前,您需要检查是否存在具有给定键的值,并实施合并策略。似乎您希望有一张卡片列表的地图,抓取将名称Ben传递到地图的列表并添加到列表中。您是否考虑过使用合并策略?