何时使用java集合singletonMap方法?

何时使用java集合singletonMap方法?,java,collections,map,Java,Collections,Map,我不明白你为什么需要java集合? 它在多线程应用程序中有用吗?如果您需要将映射作为参数传递给某些常规代码,或者作为方法的结果,并且您知道在这种特定情况下(但在将映射传递给相同常规代码的其他情况下可能不可用),则它非常有用。在这种情况下,SingletonMap比完整的map实现更高效,而且对程序员来说也更方便,因为您需要说的一切都可以在构造函数中说出来。它主要是为了方便和抽象。有些API将集合作为参数,最好有一种简单的方法将对象转换为集合或映射 在Java 1.3中,singletonMap和

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

如果您需要将映射作为参数传递给某些常规代码,或者作为方法的结果,并且您知道在这种特定情况下(但在将映射传递给相同常规代码的其他情况下可能不可用),则它非常有用。在这种情况下,SingletonMap比完整的map实现更高效,而且对程序员来说也更方便,因为您需要说的一切都可以在构造函数中说出来。

它主要是为了方便和抽象。有些API将集合作为参数,最好有一种简单的方法将对象转换为集合或映射


在Java 1.3中,singletonMap和singletonList实际上是在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通常适用于这些情况,但与上面的代码相比,它们仍然非常冗长。

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

许多答案告诉您何时使用,但我想指出何时不使用它

如果你想在以后放置物品,不要使用它


因为singletonMap的put实现将抛出不支持的操作异常

@skaffman:那将是我的错。起初我以为OP是指Commons类SingletonMap,所以我编辑了它。从那时起,我已经将我的改变回滚;没有singletonSet方法,它只是在使用Spring的命名参数JDBC模板的DAO中一直使用singletonI-use-singletonMap。如果您有一个简单的select语句,比如select foo from bar,其中id=:barId,那么您将需要一个带有单个键值对的参数映射,barId=123。这是一个使用singletonMap的好地方。如果任何API使用map作为输入,而我使用集合。singletonkey,value,那么我传递的是不可变的map,这可能对该API不好,因为可能是API向该映射添加了更多元素,在这种情况下,由于它是不可变的,所以无法执行任何操作。@AKS:理论上是的,但实际上,只读访问要常见得多,从API文档中应该可以清楚地看到条目是否添加到作为参数传递的映射中。@PlabonDutta:否。您可以通过尝试、查看API文档或简单地思考singleton的含义来了解这一点。