Java 从guava(谷歌)Multimap中删除不会删除密钥本身。为什么?如何做到这一点?

Java 从guava(谷歌)Multimap中删除不会删除密钥本身。为什么?如何做到这一点?,java,collections,guava,multimap,Java,Collections,Guava,Multimap,我使用的是guava的谷歌收藏库,我相信是最新的版本 我发现,一旦我从给定值K的映射中删除了最后的(K,V)对,映射仍然包含K的条目,其中V是一个空集合 我希望地图不包含此条目。为什么我不能移除它?或者,如果我可以,怎么做 这可能是我错过的一些简单的事情。下面是一个代码示例。谢谢 // A plain ordinary map. Map<Integer, Integer> hm = new HashMap<Integer, Integer>();

我使用的是guava的谷歌收藏库,我相信是最新的版本

我发现,一旦我从给定值K的映射中删除了最后的(K,V)对,映射仍然包含K的条目,其中V是一个空集合

我希望地图不包含此条目。为什么我不能移除它?或者,如果我可以,怎么做

这可能是我错过的一些简单的事情。下面是一个代码示例。谢谢

    // A plain ordinary map.
    Map<Integer, Integer> hm = new HashMap<Integer, Integer>();
    hm.put(1, 2);
    hm.remove(1);
    // Value of key 1 in HashMap: null
    System.out.println("Value of key 1 in HashMap: " + hm.get(1));

    // A list multimap.
    ListMultimap<Integer, Integer> lmm = ArrayListMultimap.<Integer, Integer> create();
    lmm.put(1, 2);
    lmm.remove(1, 2);
    // Value of key 1 in ArrayListMultiMap: []
    System.out.println("Value of key 1 in ArrayListMultiMap: " + lmm.get(1));

    // A set multimap.
    SetMultimap<Integer, Integer> smm = HashMultimap.<Integer, Integer> create();
    smm.put(1, 2);
    smm.remove(1, 2);
    // Value of key 1 in HashMultimap: []
    System.out.println("Value of key 1 in HashMultimap: " + smm.get(1));
//一张普通的地图。
Map hm=新的HashMap();
hm.put(1,2);
hm.remove(1);
//HashMap中键1的值:null
System.out.println(“HashMap中键1的值:“+hm.get(1));
//一个多重映射列表。
ListMultimap lmm=ArrayListMultimap。创建();
lmm.put(1,2);
lmm.移除(1,2);
//ArrayListMultiMap中键1的值:[]
System.out.println(“ArrayListMultiMap中键1的值:+lmm.get(1));
//一组多重映射。
SetMultimap smm=HashMultimap。创建();
smm.put(1,2);
smm.移除(1,2);
//HashMultimap中键1的值:[]
System.out.println(“HashMultimap中键1的值:“+smm.get(1));

要从
多地图
中完全删除基础条目,您需要使用
地图
视图:

multimap.asMap().remove(key);

实际上,当删除多重贴图中某个键的最后一个值时,该键将从贴图中删除。 例如,参见“containsKey”的行为

System.out.println("ListMultimap contains key 1? " + lmm.containsKey(1));
但是,当您从multimap获取值时,如果没有与键关联的集合,它将返回空集合,请参阅AbstractMultimap中get的实现:

/**
 * {@inheritDoc}
 *
 * <p>The returned collection is not serializable.
 */
@Override
public Collection<V> get(@Nullable K key) {
  Collection<V> collection = map.get(key);
  if (collection == null) {
    collection = createCollection(key);
  }
  return wrapCollection(key, collection);
}
/**
*{@inheritardoc}
*
*返回的集合不可序列化。
*/
@凌驾
公共集合get(@Nullable K key){
Collection=map.get(键);
if(集合==null){
collection=createCollection(键);
}
返回wrapCollection(键,集合);
}

multimap上的remove实际上确保一旦值集合为空,就会从multimap.interest中删除键。我不知道。不过,它似乎是一个未记录的特性(在javadocs中没有看到任何相关内容)。这样的实现细节将来可能会改变……我认为这不会改变。它遵循规则的映射语义。如果它会改变,他们需要确保
containskey
行为是正确的。