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);
不是很理想,因为您必须创建两个映射,一个用于排序,另一个用于不可变。
添加回答
举报