我不明白你爲什麼需要java集合singletonMap? 它在多線程應用程序中有用嗎?什麼時候會使用java Collections singletonMap方法?
回答
基本上,它可以讓你做到這一點:
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。如果你有一個簡單的select語句,比如「select foo from bar where id =:barId」,那麼你將需要一個帶有單個鍵值對barId = 123的參數映射。這是使用singletonMap()的好地方。 – spaaarky21
如果任何API將映射作爲輸入並且我使用Collections.singleton(key,value),那麼我傳遞了不可變映射,這可能對該API不太好,因爲可能是該API向此映射添加更多元素,並且在這種情況下,沒有什麼可以做,因爲它是不可變的。 – AKS
@AKS:理論上是的,但實際上只讀訪問是非常普遍的,並且應該從API文檔中明確是否將條目添加到作爲參數傳遞的映射中。 –
如果您需要將映射傳遞給某些通用代碼(作爲參數或作爲方法的結果),並且您知道在這種特殊情況下 - 但可能不會在其他情況下傳遞映射到相同的通用代碼 - 您想要通過的地圖只有一個鍵。在這種情況下,SingletonMap比完整的地圖實現更有效率,對於程序員也更方便,因爲您需要說的所有內容都可以在構造函數中說明。
很好的解釋 –
它主要是爲了方便和抽象。有些API以Collection
作爲參數,很高興有一個簡單的方法將對象轉換爲Set
或Map
。
singletonMap()
和singletonList()
實際上是在Java 1.3中的singletonSet()
之後引入的,因爲singletonSet()
被證明是有用的。
沒有singletonSet()方法,它只是被稱爲singleton() –
這僅僅是另一個例子,但我寫這行代碼:
@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}
注意@Override
。更一般的界面可以採取很多事情的地圖;這個特定的實例總是返回一個包含一件事情的地圖。還要注意地圖的關鍵是Enum。所以地圖不應該很大,它們只是應該包含任何指定動作的結果。在我的實例中,最多有5個動作,而這個實例只使用其中的一個。
要完成,EnumSet
或EnumMap
在這些情況下通常是合適的,但與上面的代碼相比,這些仍然是煩人的冗長。
此外,由Collections.singletonMap()返回的SingletonMap實現比常規HashMap具有更小的內存佔用。它只需要包含兩個成員字段:鍵和值,而HashMap維護一個Node對象的內部數組以及其他成員字段。因此,如果您在內存中創建這些映射的批次,那麼使用Collections.singletonMap()將是一個謹慎的選擇。
很多答案告訴你的時候,但我想指出何時not use it
如果你想put items later on
不使用它,
因爲singletonMap
看跌實現將拋出UnsupportedOperationException
- 1. 什麼時候Java Collections在使用Collections.addAll()時拋出NullPointerException異常
- 2. 什麼時候會調用getPlaceholderTemplateForComplication()方法?
- 3. 你什麼時候使用新方法?
- 4. 什麼時候使用initWithCoder:方法?
- 5. 什麼時候使用getX方法
- 6. 什麼時候會使用jQuery isImmediatePropagationStopped()方法?
- 7. 什麼時候會使用initWithFormat:arguments:?
- 8. 什麼時候會使用ObjectInputStream.readUshared()與.readObject()?
- 9. Java URLConnection - 什麼時候需要使用connect()方法?
- 10. 請告訴我什麼時候在java中使用getInstance()方法。
- 11. 什麼時候在Java中使用「this」
- 12. 什麼時候應該使用AWS,什麼時候不使用
- 13. 什麼時候ConvertBack方法被調用?
- 14. 什麼時候調用SQLiteOpenHelper方法?
- 15. 什麼時候調用layoutSubviews方法?
- 16. intn_t什麼時候使用它,什麼時候不使用
- 17. 什麼時候會使用malloc over zmalloc?
- 18. 什麼時候會想要使用OneTuple?
- 19. 什麼時候會使用.fini_array部分?
- 20. 什麼時候會使用mysqli_ping?
- 21. 什麼時候使用ByteString,什麼時候不使用?
- 22. 什麼時候使用Ruby和什麼時候使用PHP
- 23. 什麼時候使用類方法而不是實例方法?
- 24. 什麼時候應該使用async/await,什麼時候不用?
- 25. 什麼時候使用__proto__和什麼時候使用原型
- 26. 蘋果什麼時候會棄用IAP驗證的舊方法?
- 27. JAVA:知道什麼時候調用方法
- 28. 當我們需要Arraylist中的Collections類方法時,爲什麼不擴展Collections?
- 29. 什麼時候使用Dispose
- 30. SQL Server CASE什麼時候不使用CASE什麼時候
@skaffman:那會是我的不好。起初我以爲OP是指Commons類'SingletonMap',所以我編輯它。我已經回滾了我的更改;) – tskuzzy