当使用java.util.Map.of()时,它不保留顺序。有没有一种方法可以使Map保持不变,从而保持有序?
java.util.Map.of()
Map
laik7k3q1#
创建一个LinkedHashMap,用调用Collections.umodifiableMap进行换行,如 * 不可修改的视图集合 * 中所述。
LinkedHashMap
Collections.umodifiableMap
Map.of
Map.of方法使用的Map实现在Javadoc中有明确的文档说明。其中一个要点清楚地表明键没有排序:不可修改Map...Map的迭代顺序是未指定的,可以更改。...因此,如果需要排序,必须使用Map的另一个实现。
SortedMap
你说的“保持顺序”是指排序顺序吗?Java包含SortedMap接口,用于定义Map实现的行为,这些实现在所有键之间保持总的排序。有两种与Java捆绑的实现:TreeMap和ConcurrentSkipListMap。
TreeMap
ConcurrentSkipListMap
您的问题不清楚,但我猜您所说的“保留排序”是指您希望密钥按照添加到Map中的顺序来维护。LinkedHashMap就是这样做的,正如correct Answer by randypaq13中提到的那样。引用Javadoc:。。。可预测的迭代顺序。。...维护一个双向链表,遍历其所有条目。这个链表定义了迭代顺序,通常是键插入到Map中的顺序(插入顺序)。请注意,如果将关键字重新插入到Map中,则插入顺序不受影响。
LinkedHashMap可以满足您对原始插入顺序的需求,但不能满足您对不可修改的需求。为此,使用Collections类及其实用方法unmodifiableMap。
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实现。
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,一个用于排序,另一个是不可变的。
ogq8wdun3#
如果Google Guava已经存在于您的项目中,那么ImmutableMap将满足您的需求。1.不变性(不是不可修改的视图)和1.迭代顺序=创建顺序更多关于ImmutableCollection类型。
ImmutableMap
lawou6xi4#
我想你要找的是LinkedHashMap。链接的HashMap就像一个常规的HashMap,它保留了插入顺序。
4条答案
按热度按时间laik7k3q1#
tl; dr
创建一个
LinkedHashMap
,用调用Collections.umodifiableMap
进行换行,如 * 不可修改的视图集合 * 中所述。Map.of
不可修改的静态工厂MapMap.of
方法使用的Map
实现在Javadoc中有明确的文档说明。其中一个要点清楚地表明键没有排序:不可修改Map
...
Map的迭代顺序是未指定的,可以更改。
...
因此,如果需要排序,必须使用
Map
的另一个实现。SortedMap
你说的“保持顺序”是指排序顺序吗?
Java包含
SortedMap
接口,用于定义Map
实现的行为,这些实现在所有键之间保持总的排序。有两种与Java捆绑的实现:
TreeMap
和ConcurrentSkipListMap
。保留原始插入顺序
您的问题不清楚,但我猜您所说的“保留排序”是指您希望密钥按照添加到Map中的顺序来维护。
LinkedHashMap
就是这样做的,正如correct Answer by randypaq13中提到的那样。引用Javadoc:
。。。可预测的迭代顺序。。
...维护一个双向链表,遍历其所有条目。这个链表定义了迭代顺序,通常是键插入到Map中的顺序(插入顺序)。请注意,如果将关键字重新插入到Map中,则插入顺序不受影响。
不可修改Map
LinkedHashMap
可以满足您对原始插入顺序的需求,但不能满足您对不可修改的需求。为此,使用Collections
类及其实用方法unmodifiableMap
。请务必研究不可修改的视图集合的文档,以了解它们的行为。单击可缩放。
下面是一个表格,概述了Java 11捆绑的所有
Map
实现。relj7zay2#
以下内容不保留顺序:
如果你想拥有一个不可变的有序
Map
,那么你必须走这个迂回的路:不是很理想,因为你必须创建两个Map,一个用于排序,另一个是不可变的。
ogq8wdun3#
如果Google Guava已经存在于您的项目中,那么
ImmutableMap
将满足您的需求。1.不变性(不是不可修改的视图)和
1.迭代顺序=创建顺序
更多关于ImmutableCollection类型。
lawou6xi4#
我想你要找的是LinkedHashMap。链接的HashMap就像一个常规的HashMap,它保留了插入顺序。