如何在Java 9中创建不可修改的Map?


**不可修改的Map**是指一旦创建了Map的不可修改实例,其**键**和**值**就不能被**添加**、**删除**或**更新**。Map中的静态工厂方法:**Map.of()** 和 **Map.ofEntries()** 提供了一种方便的方式来在**Java 9**中创建不可修改的Map。

使用**Map.of()** 和 **Map.ofEntries()** 方法创建的Map实例具有以下特征。

  • 工厂方法返回的Map通常是**不可变的**。这意味着**键**和**值**不能被**添加**、**删除**或**更新**。对Map调用任何修改方法都会导致**UnsupportedOperationException**异常。
  • 如果Map中包含的**键/值**本身是**可变的**,则可能导致Map的行为**不一致**或其内容看起来发生了变化。
  • 不可变的Map不允许**空键**和**空值**。如果尝试使用空键或空值创建Map,则会抛出**NullPointerException**异常。
  • 在创建时就会拒绝**重复的键**。将重复的键传递给静态工厂方法会导致**IllegalArgumentException**异常。
  • 如果所有键和值都是可序列化的,则**不可变的Map**也是**可序列化的**。
  • 映射迭代的顺序是**未指定的**,并且可能会发生变化。

语法

Map.of(k1, v1, k2, v2)
Map.ofEntries(entry(k1, v1), entry(k2, v2),...)

Map.of()示例

import java.util.Map;
public class UnmodifiableMapTest {
   public static void main(String[] args) {
      Map<String, String> empMap = Map.of("101", "Raja", "102", "Adithya", "103", "Jai", "104", "Chaitanya");
      System.out.println("empMap - " + empMap);
      empMap.put("105", "Vamsi");      // throws UnsupportedOperationException
   }
}

输出

empMap - {104=Chaitanya, 103=Jai, 102=Adithya, 101=Raja}
Exception in thread "main" java.lang.UnsupportedOperationException
         at java.base/java.util.ImmutableCollections.uoe(Unknown Source)
         at java.base/java.util.ImmutableCollections$AbstractImmutableMap.put(Unknown Source)
         at UnmodifiableMapTest.main(UnmodifiableMapTest.java:7)


Map.ofEntries()示例

import java.util.Map;
import static java.util.Map.entry;
public class UnmodifidMapTest {
   public static void main(String[] args) {
      Map<String, String> empMap = Map.ofEntries(entry("101", "Raja"), entry("102", "Adithya"), entry("103", "Jai"), entry("104", "Chaitanya"));
      System.out.println("empMap - " + empMap);
   }
}

输出

empMap - {102=Adithya, 101=Raja, 104=Chaitanya, 103=Jai}

更新于:2020年2月21日

307 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告