1

我的函数返回一个 HashMap 成员的键集。

JavaDoc

集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。

我想避免这种行为。

我想返回一个不可修改的集合,也许是该集合的副本。

我不希望对集合或地图的更改相互反映。

是否有任何最佳实践来处理这种情况?

4

3 回答 3

2

就个人而言,我会选择 Google 的 Guava - 特别是因为我想返回一个不可修改的集合,也许是该集合的副本。- 如果地图增长,ImmutableSet则不会显示增长:

ImmutableSet.copyOf(map.keySet());

或者,如果您想使用标准 Java API - 注意结果Set会随着您的Map增长而增长:

Collections.unmodifiableSet(map.keySet());

考虑到您的要求,使用上述任何一种都被认为是良好的做法。

于 2013-07-18T01:13:17.897 回答
1

标准方法是返回一个副本,通常使用复制构造函数

这是您可以使用的实用方法:

public static <K, V> Set<Map.Entry<K, V>> copyKeys(Map<K, V> map) {
    return new HashSet<Map.Entry<K, V>>(map.keySet());
}
于 2013-07-18T01:36:07.057 回答
1

您可以使用Collections.unmodifiableSet专为此设计的标准。尝试修改包装的 Set 最终会在UnsupportedOperationException

于 2013-07-18T03:07:36.267 回答