亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用不可變的 Map 保留順序?

使用不可變的 Map 保留順序?

哆啦的時光機 2023-08-09 16:21:37
使用時java.util.Map.of(),它不保留順序。有沒有一種方法可以保持不可變Map并保留順序?
查看完整描述

4 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

博士

進行一個LinkedHashMap, 并調用 來包裝Collections.umodifiableMap,如不可修改的視圖集合中所討論的。

Map.of不可修改的靜態工廠映射

Javadoc 中清楚地記錄了方法Map所使用的實現。Map.of其中一個要點明確表明鍵未排序:

不可修改的地圖

映射的迭代順序未指定,并且可能會發生變化。

因此,如果需要排序,您必須使用另一種實現Map。

SortedMap

“保留順序”是指排序順序嗎?

Java 包含SortedMap用于定義Map實現的行為的接口,這些實現維護所有鍵的總排序。

Java 捆綁了兩種這樣的實現:TreeMapConcurrentSkipListMap

保留原始插入順序

您的問題不清楚,但我猜您所說的“保留順序”的意思是您希望按照添加到地圖的順序維護密鑰。

引用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 捆綁的所有實現。

https://img3.sycdn.imooc.com/64d34cc00001172115281110.jpg

查看完整回答
反對 回復 2023-08-09
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

我相信您正在尋找的是LinkedHashMap。鏈接 Hashmap 與保留插入順序的常規 HashMap 類似。



查看完整回答
反對 回復 2023-08-09
?
呼啦一陣風

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);

不是很理想,因為您必須創建兩個映射,一個用于排序,另一個用于不可變。


查看完整回答
反對 回復 2023-08-09
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

如果 Google Guava 已存在于您的項目中,那么?ImmutableMap將滿足您的需求。

  1. 不變性(不是不可修改的視圖)和

  2. 迭代順序 = 創建順序

查看完整回答
反對 回復 2023-08-09
  • 4 回答
  • 0 關注
  • 228 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號