首页
学习
活动
专区
圈层
工具
发布

Map.of()的兄弟方法Map.ofEntries()使用禁忌

在创建不可变的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()相比,它支持更多的键值对,更复杂的数据结构。

希望本文对你有帮助。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OFWS7l70Ack54UYqtQaJZjxg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。
领券