Java 中的不可变 Map

10 Sept 2024 | 4 分钟阅读

顾名思义,不可变 Map 类型被称为不可变 Map。它表示 Map 的内容在声明后是只读的,并且此后是固定或不变的。任何尝试修改、添加或删除 Map 中元素的行为都会抛出 UnsupportedOperationException。不可变 Map 也不允许 null 元素。如果尝试创建一个带有 null 元素的不可变 Map,则会触发 NullPointerException。在尝试将 null 条目包含在 Map 中时,会引发 UnsupportedOperationException。

注意:由于它是一个不可变集合,而不是由不可变对象组成的集合,因此可以对其内容进行任何更改。

类声明

类层次结构

为了创建不可变 Map,有几种生成方法。它们包括:

  1. 使用 Guava 的 copyOf() 函数从现有 Map 创建
  2. 使用 Collections.singletonMap()
  3. 使用 ImmutableMap 的 Builder()
  4. 使用 Guava 的 of() 函数新建 ImmutableMap
  5. 从现有 Map 创建 ImmutableMap

方法:使用 Guava 的 copyOf() 函数从现有 Map 创建

看起来您想使用 Guava 的 copyOf() 函数来复制一个已有的 Map。Guava 是一个 Java 库,它提供了许多用于处理集合和其他常见编程任务的实用类。

实施

文件名: MappingExample1.java

输出

{1=Welcome, 2=to, 3=the, 4=World}

方法:使用 Collections.singletonMap()

Collections.singletonMap() 方法返回一个只包含一个映射的不可变 Map。它可用于创建一个键值对来构建一个 Map。

实施

文件名: MappingExample2.java

输出

{John Roll No:=104}

方法:使用 ImmutableMap 的 Builder()

Builder() 函数由 ImmutableMap 类在 Guava 中提供。此函数允许您从现有 Map 生成 ImmutableMap,创建新的 ImmutableMap,或两者兼可。

使用 ImmutableMap 的 Builder() Builder() 函数由 ImmutableMap 类在 Guava 中提供。此函数允许您从现有 Map 生成 ImmutableMap,创建新的 ImmutableMap,或两者兼可。

实施

文件名: MappingExample4.java

输出

{1=Welcome, 2=to, 3=the, 4=World}

方法:使用 Guava 的 of() 函数新建 ImmutableMap

可以使用 Guava 的 of() 函数创建不可变 Map。您可以向此方法提供一组键值对来初始化 Map。ImmutableMap.of() 已重载以处理不同数量的元素(最多 5 个)。如果您需要创建一个包含超过五个元素的 Map,您可以使用 ImmutableMap.builder() 来创建 Map。

实施

文件名: MappingExample5.java

输出

{1=Welcome, 2=to, 3=the, 4=World}

方法:从现有 Map 创建 ImmutableMap

在 Guava 中,我们可以使用 copyOf() 函数将现有 Map 转换为不可变 Map。在这里,我们首先创建一个 existingMap,一个包含两个键值对的普通 HashMap。然后,我们使用 ImmutableMap.copyOf(previousMap) 创建该 Map 的不可变副本。此处使用的是 ImmutableMap。

由于 ImmutableMap.copyOf() 会创建原始 Map 的副本,因此在 ImmutableMap 形成后对原始 Map 所做的修改不会影响不可变版本。

实施

文件名: MappingExample6.java

输出

{1=Welcome, 2=to, 3=the, 4=World}

不可变 Map 的优点

  • 它是线程安全的。
  • 它们占用内存少。
  • 由于它们是不可更改的,因此可以毫无问题地将其转移到第三方运行的库中。

不可变 Map 的缺点

  • 不可变类需要为每个唯一值创建不同的对象,这是它们的主要缺点。这些对象创建成本可能很高,尤其是当它们很大时。
  • 它们的灵活性也有限,因为可能无法更新内容。
  • 为了创建不可变 Map,我们还需要一个新的实例,这涉及到复制现有数据,导致更多的内存使用和更慢的性能。