如何在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}
广告