2013-07-18 66 views
0

我的函數返回HashMap成員的鍵集。最佳做法:如何從java中的方法返回地圖的keyset

the JavaDoc

該組由映射支持,所以對映射的改變被反映在該組,並且反之亦然。

我想避免這種行爲。

我想返回一個不可修改的集合,也許是集合的一個副本。

我不希望更改設置或地圖以反映在另一個。

有沒有處理這種情況的最佳實踐?

+0

您是否擔心突變集合的結構,突變集合中的項目的屬性或兩者?如果你只是擔心第一件事,那就創建一個新的Set:'Set freshSet = new HashSet (map.keySet());'' – jahroy

回答

1

就我個人而言,我會使用谷歌的番石榴 - 尤其是我想返回一個不可修改的集合,也許是該集合的一個副本。 - 如果地圖上的增長,ImmutableSet將不會出現增長:

ImmutableSet.copyOf(map.keySet());

或者,如果你想使用標準的Java API - 請注意,導致Set將隨着你的成長Map

Collections.unmodifiableSet(map.keySet());

考慮到您的要求,使用上述任何一種都被認爲是良好的做法。

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()); 
} 
0

您可以使用標準Collections.unmodifiableSet這正是專爲。嘗試修改包裝的Set將最終在UnsupportedOperationException

相關問題