4 回答

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

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
我相信您正在尋找的是LinkedHashMap。鏈接 Hashmap 與保留插入順序的常規(guī) HashMap 類似。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
以下內(nèi)容不保留順序:
Map.of("a", 1, "b", 2);
如果你想要一個(gè)不可變的ordered Map,那么你必須采取這種迂回的方式:
var map = new LinkedHashMap<String, String>();
map.put("a", 1);
map.put("b", 2);
map = Collections.unmodifiableMap(map);
不是很理想,因?yàn)槟仨殑?chuàng)建兩個(gè)映射,一個(gè)用于排序,另一個(gè)用于不可變。

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果 Google Guava 已存在于您的項(xiàng)目中,那么?ImmutableMap
將滿足您的需求。
不變性(不是不可修改的視圖)和
迭代順序 = 創(chuàng)建順序
添加回答
舉報(bào)