我的函数返回一个 HashMap 成员的键集。
从JavaDoc:
集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。
我想避免这种行为。
我想返回一个不可修改的集合,也许是该集合的副本。
我不希望对集合或地图的更改相互反映。
是否有任何最佳实践来处理这种情况?
就个人而言,我会选择 Google 的 Guava - 特别是因为我想返回一个不可修改的集合,也许是该集合的副本。- 如果地图增长,ImmutableSet
则不会显示增长:
ImmutableSet.copyOf(map.keySet());
或者,如果您想使用标准 Java API - 注意结果Set
会随着您的Map
增长而增长:
Collections.unmodifiableSet(map.keySet());
考虑到您的要求,使用上述任何一种都被认为是良好的做法。
标准方法是返回一个副本,通常使用复制构造函数:
这是您可以使用的实用方法:
public static <K, V> Set<Map.Entry<K, V>> copyKeys(Map<K, V> map) {
return new HashSet<Map.Entry<K, V>>(map.keySet());
}
您可以使用Collections.unmodifiableSet
专为此设计的标准。尝试修改包装的 Set 最终会在UnsupportedOperationException