Java Multimap get方法是否创建临时列表的动态分配?

Java Multimap get方法是否创建临时列表的动态分配?,java,guava,multimap,Java,Guava,Multimap,Java Multimap.get()方法是否创建临时列表的动态分配? 从源代码: Collection<V> get(@Nullable K key); Returns the set of all keys, each appearing once in the returned set. Changes to the returned set will update the underlying multimap, and vice versa. @return the

Java Multimap.get()方法是否创建临时列表的动态分配? 从源代码:

Collection<V> get(@Nullable K key);


Returns the set of all keys, each appearing once in the returned set.
Changes to the returned set will update the underlying multimap, and vice
versa.

@return the collection of distinct keys
Collection get(@Nullable K key);
返回所有键的集合,每个键在返回的集合中出现一次。
对返回集的更改将更新基础multimap,反之亦然
反之亦然。
@返回不同键的集合

Multimap
是一个接口,因此最终答案将取决于实现。如果我们以
ArrayListMultimap
为例,我们可以在这里看到源代码:

如果跟踪继承层次结构,您会发现
get
是在抽象基类
AbstractMapBasedMultimap
中定义的:

我们可以看到,如果未找到,则会为键创建一个
集合

@Override
public Collection<V> get(@Nullable K key) {
  Collection<V> collection = map.get(key);
  if (collection == null) {
    collection = createCollection(key);
  }
  return wrapCollection(key, collection);
}
在这里,我们可以看到一个新的列表正在按需创建。然而,如原问题所述,将其称为“临时”是不正确的。这将是地图中支持该条目的真实列表


但是,请记住,这个答案适用于
Multimap
的一个特定实现和一个特定版本的代码库。这演示了探索代码的过程,因此如果您对其他实现或其他版本有疑问,那么您可以浏览代码以查看行为。

请澄清这个问题-太简单了-这不太正确-它只在该键没有值时分配新列表,而不是,正如OP所描述的,“暂时的”,它是真实的。(通过调用
get()
并将值添加到返回的
列表中,然后在
多重映射中查找这些值,您可以轻松地对此进行测试。)(我很确定没有一个实现分配了一个临时集合,因为这会违反提供实时视图的合同,但我实际上没有全部检查。)@DavidMoles,很好的澄清。谢谢你的建议!我相应地编辑了答案。但是,请注意,如果你调用
get(K)
并且它返回一个空集合,并且您不向该集合添加任何内容,这将是临时的,因为当您不再有任何对它的引用时,所创建的集合将被GCed。这是因为支持集合(即
ArrayList
创建的
ArrayList
)仅当至少有一个元素时才添加到backing
Map
中。请注意,
wrapCollection
每次都会创建一个新对象
@Override List<V> createCollection() {
  return new ArrayList<V>(expectedValuesPerKey);
}