【发布时间】:2011-10-30 19:57:21
【问题描述】:
我不明白你为什么需要 java Collections singletonMap? 它在多线程应用程序中有用吗?
【问题讨论】:
-
@skaffman:那可不好。起初我以为 OP 指的是 Commons 类
SingletonMap,所以我对其进行了编辑。我已经回滚了我的更改;)
标签: java collections map
我不明白你为什么需要 java Collections singletonMap? 它在多线程应用程序中有用吗?
【问题讨论】:
SingletonMap,所以我对其进行了编辑。我已经回滚了我的更改;)
标签: java collections map
如果您需要将映射传递给一些通用代码(作为参数,或作为方法的结果)并且您知道在这种特殊情况下 - 但在将映射传递到的其他情况下可能不会相同的通用代码——您要传递的地图只有一个键。在这种情况下,SingletonMap 比成熟的地图实现更高效,对程序员来说也更方便,因为你需要说的所有内容都可以在构造函数中说出来。
【讨论】:
主要是为了方便和抽象。一些 API 将 Collection 作为参数,很高兴有一种简单的方法将对象转换为 Set 或 Map。
singletonMap() 和 singletonList() 实际上是在 Java 1.3 中的 singletonSet() 之后引入的,因为 singletonSet() 被证明是有用的。
【讨论】:
基本上,它允许您这样做:
callAPIThatTakesAMap(Collections.singletonMap(key, value));
而不是这样:
Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);
当您只有一个键/值对时,这会更好。这种情况可能不会经常出现,但singleton() 和singletonList() 可能非常有用。
【讨论】:
这只是另一个例子,但我写了这行代码:
@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}
注意@Override。该界面更普遍地可以获取许多事物的地图;这个特定的实例总是返回一个包含一件事的映射。另请注意,映射的键是枚举。所以地图永远不应该很大,它们只应该包含指定的任何操作的结果。在我的真实示例中,最多有 5 个动作,而这个实例化只使用其中一个。
为了完整起见,EnumSet 或 EnumMap 在这些情况下通常是合适的,但与上面的代码相比,它们仍然非常冗长。
【讨论】:
此外,由 Collections.singletonMap() 返回的 SingletonMap 实现比常规 HashMap 具有更小的内存占用。它只需要包含两个成员字段:键和值,而 HashMap 维护一个 Node 对象和其他成员字段的内部数组。因此,如果您要在内存中创建 很多 个这些映射,使用 Collections.singletonMap() 将是一个谨慎的选择。
【讨论】:
很多答案告诉你什么时候,但我想指出什么时候not use it
不要使用如果你想put items later on,
因为 singletonMap 的 put 实现会抛出 UnsupportedOperationException
【讨论】: