在创建不可变的Map集合时,如果小于10对键值对可以使用Map.of()方法,超过10对键值对就只能用Map.ofEntries(),一起看下使用Map.ofEntries()都有哪些注意事项。
一、Map.ofEntries()简介
Map.ofEntries()是 JDK 9 引入的一个工厂方法,用于创建包含多个键值对的不可变Map。与Map.of()不同,Map.ofEntries()支持传入超过10对键值对,因此它更加灵活。
Map.ofEntries()方法的基本语法如下:
Map<K, V> map = Map.ofEntries(Map.entry(K key1, V value1), Map.entry(K key2, V value2), ..., Map.entry(K keyN, V valueN));
其中,Map.entry()是一个静态方法,用于创建Map.Entry对象。我们可以将多个Map.Entry对象传递给Map.ofEntries()来创建一个包含多个键值对的Map。
二、Map.ofEntries()使用示例
假设我们想创建一个包含多个键值对的不可变Map,可以使用Map.ofEntries()来实现:
import java.util.Map;
publicclassMapOfEntriesExample{
publicstaticvoidmain(String[] args){
Map<String, Integer> map = Map.ofEntries(
Map.entry("Apple", 1),
Map.entry("Banana", 2),
Map.entry("Cherry", 3)
);
System.out.println(map);
}
}
输出:
{Apple=1, Banana=2, Cherry=3}
三、Map.ofEntries()方法的特性
支持任意数量的键值对
与Map.of()不同,Map.ofEntries()不限制键值对的数量。我们可以传入任意数量的Map.Entry对象,创建一个包含任意数量键值对的不可变Map。
例如:
Map<String, Integer> largeMap = Map.ofEntries(
Map.entry("A", 1),
Map.entry("B", 2),
Map.entry("C", 3),
Map.entry("D", 4),
// 可以继续添加更多键值对
Map.entry("Z", 26)
);
不可变性
Map.ofEntries()创建的Map也是不可变的。一旦创建,我们就不能修改映射的内容。任何修改操作(如put或remove)都会抛出UnsupportedOperationException。
例如:
Map<String, Integer> map = Map.ofEntries(
Map.entry("key1", 1),
Map.entry("key2", 2)
);
map.put("key3", 3); // 抛出 UnsupportedOperationException
键值对使用Map.entry()
使用Map.ofEntries()时,必须使用Map.entry()来创建每个键值对。这是因为Map.entry()返回的是一个Map.Entry对象,它代表了Map中的一个键值对。
Map<String, String> map = Map.ofEntries(
Map.entry("key1", "value1"),
Map.entry("key2", "value2")
);
支持更复杂的数据类型
与Map.of()相比,Map.ofEntries()不仅支持较多的键值对,还能够处理复杂的键值类型,比如自定义对象作为键或值。
Map<MyClass, String> map = Map.ofEntries(
Map.entry(new MyClass(1), "Object 1"),
Map.entry(new MyClass(2), "Object 2")
);
没有键值对数量限制
Map.ofEntries()不像Map.of()限制键值对数量,因此可以创建包含大量键值对的Map。不过,仍然需要注意性能和内存使用。
四、Map.ofEntries()使用时的注意事项
不支持null键或null值
就像Map.of()一样,Map.ofEntries()也不允许传入null键或null值。如果尝试这样做,将抛出NullPointerException。
例如:
Map<String, String> map = Map.ofEntries(
Map.entry("key1", null) // 抛出 NullPointerException
);
Map<String, String> map2 = Map.ofEntries(
Map.entry(null, "value1") // 抛出 NullPointerException
);
键的唯一性
与Map.of()一样,Map.ofEntries()也要求每个键在映射中是唯一的。如果传入重复的键,将抛出IllegalArgumentException。
例如:
Map<String, Integer> map = Map.ofEntries(
Map.entry("key1", 1),
Map.entry("key1", 2) // 抛出 IllegalArgumentException
);
适用于较小的静态数据
虽然Map.ofEntries()可以创建任意大小的Map,但它仍然主要适用于较小规模的静态数据。对于非常大的数据集,使用HashMap或TreeMap更为合适,且能够在运行时进行修改。
不可变性带来的限制
由于Map.ofEntries()返回的是一个不可变的Map,这意味着我们不能在后续代码中修改Map的内容。如果需要动态修改Map,应选择其他类型的Map,比如HashMap。
不支持直接修改
Map.ofEntries()创建的Map无法通过put、remove等方法进行修改,这也是它的一个主要限制。因此,在选择使用Map.ofEntries()时,确保映射的内容是静态且不需要修改的。
五、Map.ofEntries()适用场景
创建不可变的配置或常量映射
当需要创建一个包含固定键值对的Map,并且不希望映射的内容被修改时,Map.ofEntries()是一个非常适合的工具。例如,应用程序的配置文件,或是一些常量数据,可以通过Map.ofEntries()简洁地构建。
快速构建简单的映射
在编写代码时,如果需要快速构建一个包含少量键值对的不可变Map,Map.ofEntries()提供了一种非常简便的方式。它避免了使用传统的HashMap方式,写起来更加简洁和直观。
避免并发修改问题
如果希望确保Map在应用中是不可修改的,Map.ofEntries()提供的不可变性保证了数据的一致性,避免了并发修改带来的问题。
六、最后总结
Map.ofEntries()是一个强大的工具,适用于需要创建包含多个键值对的不可变Map的场景。与Map.of()相比,它支持更多的键值对,更复杂的数据结构。
希望本文对你有帮助。