能否假设java.util.ImmutableCollections始终有序?MapN类判断是否可靠?
问题
java.util.ImmutableCollections提供了不可变集合的实现,由List.of()、Set.of()、Map.of()等静态方法生成,其内部基于数组实现。能否假设这些方法生成的集合始终保持有序?
例如,若方法参数t的类型为隐藏内部类java.util.ImmutableCollections.MapN,是否可以依赖以下代码判断该Map是否有序(类似判断逻辑适用于Sets和Lists):
public static <T> boolean isOrderedMap(final T t) { final boolean isOrderedMap = "java.util.ImmutableCollections.MapN".equals(t.getClass().getCanonicalName()) || t instanceof LinkedHashMap || t instanceof SortedMap || t instanceof EnumMap || t instanceof Attributes; return isOrderedMap ? true : false; }
并认为对于这类“应有序”的标准Maps,该方法返回结果始终为true?
回答
一、ImmutableCollections生成集合的有序性说明
List.of()生成的不可变List:确实是有序的,迭代顺序严格遵循元素传入顺序,这是Java官方API明确承诺的特性。Set.of()生成的不可变Set:官方文档未保证迭代顺序稳定。当前基于数组的实现可能会按插入顺序返回元素,但这属于未公开的实现细节,未来JDK版本完全可能变更,绝对不能依赖该顺序。Map.of()/Map.ofEntries()生成的不可变Map:同样,官方API不保证键值对的迭代顺序。当前MapN实现的有序性只是巧合,不属于API承诺的特性,依赖它会导致代码在后续JDK版本中出现兼容性问题。
二、你的判断方法的问题
这个isOrderedMap方法存在严重缺陷,不能使用:
- 依赖隐藏内部类名:
java.util.ImmutableCollections.MapN是JDK的隐藏内部类,类名甚至结构都可能在JDK更新中被修改,通过类名判断完全不可靠。 - 错误归类MapN的有序性:MapN的有序性并非API承诺,不能将其归为“有序Map”范畴。
- 逻辑冗余:
return isOrderedMap ? true : false;可直接简化为return isOrderedMap;。
三、正确的有序集合使用方式
如果需要依赖有序性,应直接使用明确承诺有序的集合类型:
- 有序List:直接使用
List.of()(安全可靠)或ArrayList - 有序Set:使用
LinkedHashSet,或通过Set.copyOf(linkedHashSet)生成不可变有序Set - 有序Map:使用
LinkedHashMap、SortedMap(如TreeMap)、EnumMap等,再通过Map.copyOf()生成对应的不可变有序Map
内容的提问来源于stack exchange,提问作者fozzybear
相关产品推荐
相关产品推荐

