Java Multimap get方法是否创建临时列表的动态分配?
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
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
)仅当至少有一个元素时才添加到backingMap
中。请注意,wrapCollection
每次都会创建一个新对象
@Override List<V> createCollection() {
return new ArrayList<V>(expectedValuesPerKey);
}