java 使用不可变的Map保持排序?

ryhaxcpt  于 2023-06-20  发布在  Java
关注(0)|答案(4)|浏览(120)

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

laik7k3q

laik7k3q1#

tl; dr

创建一个LinkedHashMap,用调用Collections.umodifiableMap进行换行,如 * 不可修改的视图集合 * 中所述。

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

Map.of方法使用的Map实现在Javadoc中有明确的文档说明。其中一个要点清楚地表明键没有排序:
不可修改Map
...
Map的迭代顺序是未指定的,可以更改。
...
因此,如果需要排序,必须使用Map的另一个实现。

SortedMap

你说的“保持顺序”是指排序顺序吗?
Java包含SortedMap接口,用于定义Map实现的行为,这些实现在所有键之间保持总的排序。
有两种与Java捆绑的实现:TreeMapConcurrentSkipListMap

保留原始插入顺序

您的问题不清楚,但我猜您所说的“保留排序”是指您希望密钥按照添加到Map中的顺序来维护。LinkedHashMap就是这样做的,正如correct Answer by randypaq13中提到的那样。
引用Javadoc:
。。。可预测的迭代顺序。。
...维护一个双向链表,遍历其所有条目。这个链表定义了迭代顺序,通常是键插入到Map中的顺序(插入顺序)。请注意,如果将关键字重新插入到Map中,则插入顺序不受影响。

不可修改Map

LinkedHashMap可以满足您对原始插入顺序的需求,但不能满足您对不可修改的需求。为此,使用Collections类及其实用方法unmodifiableMap

Map< String , String > map = new LinkedHashMap<>() ;
map.put( "this" , "that" ) ;
map.put( "other" , "thing" ) ;
Map< String , String > unmodMap = Collections.unmodifiableMap( map ) ;

请务必研究不可修改的视图集合的文档,以了解它们的行为。单击可缩放。
下面是一个表格,概述了Java 11捆绑的所有Map实现。

relj7zay

relj7zay2#

以下内容不保留顺序:

Map.of("a", 1, "b", 2);

如果你想拥有一个不可变的有序Map,那么你必须走这个迂回的路:

var map = new LinkedHashMap<String, String>();
map.put("a", 1);
map.put("b", 2);
map = Collections.unmodifiableMap(map);

不是很理想,因为你必须创建两个Map,一个用于排序,另一个是不可变的。

ogq8wdun

ogq8wdun3#

如果Google Guava已经存在于您的项目中,那么ImmutableMap将满足您的需求。
1.不变性(不是不可修改的视图)和
1.迭代顺序=创建顺序
更多关于ImmutableCollection类型。

lawou6xi

lawou6xi4#

我想你要找的是LinkedHashMap。链接的HashMap就像一个常规的HashMap,它保留了插入顺序。

相关问题