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

Is the Access Time Complexity of a Map Created by Map.ofEntries() the Same as HashMap which is o(1)?

我想使用 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接口的实现class决定了操作的复杂性。

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

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

需要明确的是,HashMap.ofEntries() 不会工作,因为 ofEntries() 方法是静态的并且在 Map 接口中定义,而不是在其任何实现中 class es.

而且您不必担心无法将地图类型声明为 HashMap 或其他具体 class,无论如何,最佳做法是将地图声明为 Map界面.

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

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

也许阅读 this article 会更清楚一些。