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

Map.ofEntries()创建的Map的访问时间复杂度与O(1)的HashMap相同吗?

Map.ofEntries()创建的Map的访问时间复杂度与O(1)的HashMap相同吗?

收到一只叮咚 2023-08-16 09:57:03
我想使用 Java 9 中的新工厂方法创建一个不可变的 hashMapMap.ofEntries()内联,例如:Map<Integer, String> map = Map.ofEntries(     Map.entry(1, "One"),     Map.entry(2, "Two"),     Map.entry(3, "Three"));然后令我惊讶的是,我发现我无法以同样的方式创建不可变的 hashMap!例如,以下代码将不起作用。HashMap<Integer, String> map = HashMap.ofEntries( //not work     Map.entry(1, "One"),     Map.entry(2, "Two"),     Map.entry(3, "Three"));然后,当我想检查工厂方法返回什么类型的地图时,我发现了以下注释:调用者不应对返回实例的身份做出任何假设。所以我的问题是,不可变映射的访问时间复杂度与 o(1) 的 hashMap 相同吗?如果不是,如何创建一个既不可变又同时访问 o(1) 的映射?如果可以内联创建那就最好了。
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

可变性或不变性与 中访问操作的复杂性没有直接关系Map。例如, aHashMap将始终用于O(1)操作get(),而 aTreeMap将始终用于O(log n)。接口的实现Map决定了操作的复杂程度。

此外,始终可以创建不可修改的映射,因为在将Map项目放入任何具体类型之后,我们可以使任何具体类型不可变,如下所示:

Map<Integer, String> immutableMap = Collections.unmodifiableMap(mutableMap);

需要明确的是,这是HashMap.ofEntries()行不通的,因为该ofEntries()方法是静态的并且是在Map接口中定义的,而不是在其任何实现类中定义的。

而且您不应该担心无法将映射的类型声明为HashMap或其他一些具体类,无论如何,最佳实践是将映射声明为接口的类型Map

另外,如果您使用的是 Java 9 之前的版本并且不介意使用外部库,您可以ImmutableMap从 Guava 使用:

Map<Integer, String> immutableMap = ImmutableMap.of(key1, val1, key2, val2);
查看完整回答
反对 回复 2023-08-16
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

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