为了账号安全,请及时绑定邮箱和手机立即绑定

使用不可变的 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 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信