【问题标题】:When would I use java Collections singletonMap method?我什么时候使用 java Collections singletonMap 方法?
【发布时间】:2011-10-30 19:57:21
【问题描述】:

我不明白你为什么需要 java Collections singletonMap? 它在多线程应用程序中有用吗?

【问题讨论】:

  • @skaffman:那可不好。起初我以为 OP 指的是 Commons 类SingletonMap,所以我对其进行了编辑。我已经回滚了我的更改;)

标签: java collections map


【解决方案1】:

如果您需要将映射传递给一些通用代码(作为参数,或作为方法的结果)并且您知道在这种特殊情况下 - 但在将映射传递到的其他情况下可能不会相同的通用代码——您要传递的地图只有一个键。在这种情况下,SingletonMap 比成熟的地图实现更高效,对程序员来说也更方便,因为你需要说的所有内容都可以在构造函数中说出来。

【讨论】:

    【解决方案2】:

    主要是为了方便和抽象。一些 API 将 Collection 作为参数,很高兴有一种简单的方法将对象转换为 SetMap

    singletonMap()singletonList() 实际上是在 Java 1.3 中的 singletonSet() 之后引入的,因为 singletonSet() 被证明是有用的。

    【讨论】:

    • 没有singletonSet()方法,只是调用singleton()
    【解决方案3】:

    基本上,它允许您这样做:

    callAPIThatTakesAMap(Collections.singletonMap(key, value));
    

    而不是这样:

    Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
    m.put(key, value);
    callAPIThatTakesAMap(m);
    

    当您只有一个键/值对时,这会更好。这种情况可能不会经常出现,但singleton()singletonList() 可能非常有用。

    【讨论】:

    • 我一直在使用 Spring 的命名参数 JDBC 模板的 DAO 中使用 singletonMap。如果您有一个简单的选择语句,例如“从 id = :barId 的 bar 中选择 foo”,那么您将需要一个带有单个键值对 barId=123 的参数映射。那是使用 singletonMap() 的好地方。
    • 如果任何 API 将地图作为输入并且我正在使用 Collections.singleton(key,value) ,那么我将传递不可变地图,这可能对该 API 不利,因为可能是该 API 添加这张地图的更多元素,在这种情况下,什么都做不了,因为它是不可变的。
    • @AKS:理论上是的,但实际上只读访问更为常见,从 API 文档中应该清楚是否将条目添加到作为参数传递的映射中。
    • @PlabonDutta:不。您可以通过尝试、查看 API 文档或简单地思考“单例”的含义来知道。
    【解决方案4】:

    这只是另一个例子,但我写了这行代码:

    @Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
        return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
    }
    

    注意@Override。该界面更普遍地可以获取许多事物的地图;这个特定的实例总是返回一个包含一件事的映射。另请注意,映射的键是枚举。所以地图永远不应该很大,它们只应该包含指定的任何操作的结果。在我的真实示例中,最多有 5 个动作,而这个实例化只使用其中一个。

    为了完整起见,EnumSetEnumMap 在这些情况下通常是合适的,但与上面的代码相比,它们仍然非常冗长。

    【讨论】:

      【解决方案5】:

      此外,由 Collections.singletonMap() 返回的 SingletonMap 实现比常规 HashMap 具有更小的内存占用。它只需要包含两个成员字段:键和值,而 HashMap 维护一个 Node 对象和其他成员字段的内部数组。因此,如果您要在内存中创建 很多 个这些映射,使用 Collections.singletonMap() 将是一个谨慎的选择。

      【讨论】:

        【解决方案6】:

        很多答案告诉你什么时候,但我想指出什么时候not use it

        不要使用如果你想put items later on

        因为 singletonMap 的 put 实现会抛出 UnsupportedOperationException

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-16
          • 2018-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-20
          相关资源
          最近更新 更多