保留不可变地图的排序?

nim*_*o23 3 java collections

使用时java.util.Map.of(),它并没有保存排序。有没有一种方法可以Map保持顺序不变?

小智 5

我相信您正在寻找的是LinkedHashMap。链接Hashmap类似于保留插入顺序的常规HashMap。

  • 使用`map = Collections.immutableMap(map)`使其不可变。 (2认同)

Bas*_*que 5

tl;博士

不可修改的视图集合中所讨论的,创建一个LinkedHashMap,并调用 到。Collections.umodifiableMap

Map.of 不可修改的静态工厂映射

方法Map使用的实现Map.of清楚地记录在 Javadoc 中。要点之一清楚地表明键没有排序:

不可修改的地图

映射的迭代顺序未指定并且可能会发生变化。

所以你必须使用Mapif 需要排序的另一个实现。

SortedMap

“保留顺序”是指排序顺序吗?

Java 包含SortedMap用于定义Map实现行为的接口,这些实现在其所有键之间保持总排序。

Java 捆绑了两个这样的实现:TreeMapConcurrentSkipListMap.

保留原始广告订单

您的问题不清楚,但我想您所说的“保留顺序”是指您希望密钥按照添加到地图的顺序进行维护。LinkedHashMap就是这样做的,正如randypaq13正确答案中提到的那样

引用 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 ) ;
Run Code Online (Sandbox Code Playgroud)

请务必研究有关不可修改视图集合的文档以了解其行为。点击放大。


下表概述了Map与 Java 11 捆绑的所有实现。

Java 11 中的地图实现表,比较它们的特性