java - 由 Map.ofEntries() 创建的 map 的访问时间复杂度是否与 o(1) 的 HashMap 相同?

标签 java dictionary hashmap immutability java-9

<分区>

我想使用 Java 9 中的新工厂方法 Map.ofEntries() 内联创建一个不可变 hashMap,例如:

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"));

然后当我想查看工厂方法返回的是什么类型的map时,发现了下面的note :

Callers should make no assumptions about the identity of the returned instances.

所以我的问题是,不可变映射的访问时间复杂度是否与 o(1) 的 hashMap 相同?如果不是,如何创建一个既不可变又同时访问 o(1) 的映射?如果可以内联创建就最好了。

最佳答案

可变性或不变性与Map 中访问操作的复杂性没有直接关系。例如,对于 get() 操作,HashMap 始终是 O(1),而 TreeMap将是 O(log n)Map 接口(interface)的实现类决定了操作的复杂性。

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

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

需要明确的是,HashMap.ofEntries() 不会起作用,因为 ofEntries() 方法是静态的,并且在 Map 中定义接口(interface),不在其任何实现类中。

并且您不必担心无法将 map 的类型声明为 HashMap 或其他具体类,无论如何最好的做法是将 map 声明为 Map 界面。

此外,如果您使用的是早于 Java 9 的版本并且不介意使用外部库,您可以使用 ImmutableMap来自 Guava :

Map<Integer, String> immutableMap = ImmutableMap.of(key1, val1, key2, val2);

或许在读书this article会澄清一些事情。

关于java - 由 Map.ofEntries() 创建的 map 的访问时间复杂度是否与 o(1) 的 HashMap 相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58035231/

相关文章:

java - 如何使用jaxb将包含相同元素的不同类型映射到单个java类对象

java - 为什么使用 Maven 和 Hibernate 设置一个简单的项目会失败?

java - 如何将字幕结构的 List<String[]> 转换为 HashMap<String, List<String[]>>

java - HashMap 中的列表删除一个值

java - 从抽象类调用非静态方法时遇到问题

java - Guice 和属性文件

python - 使用 python 将每一列存储在单独的字典中

WPF:绑定(bind)到(可观察的)字典

python - 如何在字典中的特定键之间交换值?

java - 设置字段的自定义反射方法