最佳实践:如何从java中的方法返回映射的键集

时间:2013-07-18 00:58:43

标签: java map

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

来自the JavaDoc

  
    

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

  

我想避免这种行为。

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

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

有没有最佳做法来处理这种情况?

3 个答案:

答案 0 :(得分:1)

就个人而言,我会选择Google的Guava - 特别是对于我想要返回一个不可修改的集合,也许是该集合的副本。 - 如果地图增长,ImmutableSet赢了“表现出增长:

ImmutableSet.copyOf(map.keySet());

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

Collections.unmodifiableSet(map.keySet());

根据您的要求,使用上述任何一种都被视为良好做法。

答案 1 :(得分:1)

标准方法是返回副本,通常使用copy constructor

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

public static <K, V> Set<Map.Entry<K, V>> copyKeys(Map<K, V> map) {
    return new HashSet<Map.Entry<K, V>>(map.keySet());
}

答案 2 :(得分:1)

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