4 回答

TA貢獻1797條經驗 獲得超4個贊
博士
進行一個LinkedHashMap
, 并調用 來包裝Collections.umodifiableMap
,如不可修改的視圖集合中所討論的。
Map.of
不可修改的靜態工廠映射
Javadoc 中清楚地記錄了方法Map
所使用的實現。Map.of
其中一個要點明確表明鍵未排序:
不可修改的地圖
…
映射的迭代順序未指定,并且可能會發生變化。
…
因此,如果需要排序,您必須使用另一種實現Map
。
SortedMap
“保留順序”是指排序順序嗎?
Java 包含SortedMap
用于定義Map
實現的行為的接口,這些實現維護所有鍵的總排序。
Java 捆綁了兩種這樣的實現:TreeMap
和ConcurrentSkipListMap
。
保留原始插入順序
您的問題不清楚,但我猜您所說的“保留順序”的意思是您希望按照添加到地圖的順序維護密鑰。
引用Javadoc:
…可預測的迭代順序…
...維護一個貫穿其所有條目的雙向鏈表。該鏈表定義了迭代順序,通常是將鍵插入到映射中的順序(插入順序)。請注意,如果將鍵重新插入到映射中,插入順序不會受到影響。
不可修改的地圖
滿足LinkedHashMap
您對原始插入順序的需求,但不能滿足您對不可修改的需求。為此,請使用該類Collections
及其實用方法unmodifiableMap
。
Map< String , String > map = new LinkedHashMap<>() ;
map.put( "this" , "that" ) ;
map.put( "other" , "thing" ) ;
Map< String , String > unmodMap = Collections.unmodifiableMap( map ) ;
請務必研究有關不可修改視圖集合的文檔以了解它們的行為。單擊可縮放。
下表概述了Map
與 Java 11 捆綁的所有實現。

TA貢獻1802條經驗 獲得超6個贊
以下內容不保留順序:
Map.of("a", 1, "b", 2);
如果你想要一個不可變的ordered Map,那么你必須采取這種迂回的方式:
var map = new LinkedHashMap<String, String>();
map.put("a", 1);
map.put("b", 2);
map = Collections.unmodifiableMap(map);
不是很理想,因為您必須創建兩個映射,一個用于排序,另一個用于不可變。
添加回答
舉報