【问题标题】:Best practice: how to return keyset of a map from a method in java最佳实践:如何从 java 中的方法返回映射的键集
【发布时间】:2013-07-18 00:58:42
【问题描述】:

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

来自the JavaDoc

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

我想避免这种行为。

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

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

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

【问题讨论】:

  • 您是否担心改变集合的结构,改变集合中项目的属性,或两者兼而有之?如果您只担心第一件事,只需创建一个新 Set:Set<Foo> freshSet = new HashSet<Foo>(map.keySet());

标签: java map


【解决方案1】:

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

ImmutableSet.copyOf(map.keySet());

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

Collections.unmodifiableSet(map.keySet());

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      标准方法是返回一个副本,通常使用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());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2016-11-23
        • 1970-01-01
        • 2021-07-24
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多