我什么时候可以使用java Collections的singletonMap方法?

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

基本上,它可以让你做到这一点:

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

而不是这个:

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

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

如果您需要将映射传递给某些通用代码(作为参数或来自某个方法的结果),并且您知道在这种特定情况下 – 但可能不会在其他情况下将映射传递给相同的一般代码 – 你想传递的地图只有一个键。 在这种情况下,SingletonMap比完整的地图实现更有效率,对程序员也更方便,因为你需要说的一切都可以在构造函数中说出来。

这主要是为了方便和抽象。 一些API将Collection作为参数,并且有一个简单的方法将对象转换为SetMap是很好的。

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

而且,由Collections.singletonMap()返回的SingletonMap实现比常规的HashMap具有更小的内存占用。 它只需要包含两个成员字段:键和值,而HashMap维护一个Node对象的内部数组以及其他成员字段。 所以如果你在内存中创build了很多这样的地图,使用Collections.singletonMap()将会是一个谨慎的select。

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

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

注意@Override 。 更一般的界面可以采取很多事情的地图; 这个特定的实例总是返回一个包含一件事情的地图。 另外请注意,地图的关键是一个枚举。 所以地图不应该是大的,它们只是应该包含任何指定行为的结果。 在我的实例中最多有5个动作,而这个实例只使用其中的一个。

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