Java中初始化Map的几种方式
mob 发布于 2021-04-24

1、使用Map.of() and Map.ofEntries()
如果使用Java9或更高版本,则可以在单个表达式中使用值初始化映射Map.of()和Map.ofEntries()方法。

Map.of()
Java9提供了多种Map.of()重载方法以初始化最多10个键值对的映射。

Map<String, Integer> emptyMap = Map.of();
Map<String, Integer> singletonMap = Map.of("A", 1);
Map<String, Integer> map = Map.of("A", 1, "B", 2, "C", 3);

Map.ofEntries()
如果要初始化的键值对超过10个,那么应该使用Map.ofEntries()方法。此方法没有限制,可以定义任意数量的键值对。

Map<String, Integer> map = Map.ofEntries(
        Map.entry("A", 1),
        Map.entry("B", 2),
        Map.entry("C", 3),
        Map.entry("D", 4),
        Map.entry("E", 5),
        Map.entry("F", 6),
        Map.entry("G", 7),
        Map.entry("H", 8),
        Map.entry("I", 9),
        Map.entry("J", 10),
        Map.entry("K", 11),
        Map.entry("L", 12)
);

map.put("M", 13); // Throw UnsupportedOperationException
map.remove("A");  // Throw UnsupportedOperationException

可变Map
值得注意的是Map.of()和Map.ofEntries()返回一个不可变的映射,这意味着添加或删除映射中的元素会导致java.lang.UnsupportedOperationException 例外。
您可以通过在这里创建一个可变Map(通过将不可变映射复制到新的HashMap)来避免这种情况way:-

Map<String, Integer> mutableEmptyMap = new HashMap<>(Map.of());
Map<String, Integer> mutableSingletonMap = new HashMap<>(Map.of("A", 1));
Map<String, Integer> mutableMap = new HashMap<>(Map.ofEntries(
        Map.entry("A", 1),
        Map.entry("B", 2),
        Map.entry("C", 3),
        Map.entry("D", 4),
        Map.entry("E", 5),
        Map.entry("F", 6),
        Map.entry("G", 7),
        Map.entry("H", 8),
        Map.entry("I", 9),
        Map.entry("J", 10),
        Map.entry("K", 11),
        Map.entry("L", 12)
));

mutableMap.put("M", 13); // It works!
mutableMap.remove("A");  // It works!

2、使用双大括号初始化

Map<String, Integer> map = new HashMap<>() {{
    put("A", 1);
    put("B", 2);
}};

在双大括号初始化{{}}中,第一个大括号创建一个新的匿名内部类,第二个大括号声明一个实例初始值设定项块,该块在实例化匿名内部类时运行。

不建议使用这种方法,因为它在每次使用时都会创建一个额外的类。它还保存对封闭实例和任何捕获对象的隐藏引用。这可能会导致内存泄漏或序列化问题。

另一种方法是创建一个函数来初始化map:-

// It works for all Java versions, mutable map.
Map<String, Integer> map = createMap();
map.put("C", "3");  // It works!

private static Map<String, String> createMap() {
    Map<String, Integer> map = new HashMap<>();
    map.put("A", 1);
    map.put("B", 2);
    return map;
}

3、使用Java Collections
Java Collections类提供了初始化emptyMap()、singletonMap()和unmodifiableMap()的方法。注意,所有这些方法都返回不可变Map

Map<String, Integer> emptyMap = Collections.emptyMap();
Map<String, Integer> singletonMap = Collections.singletonMap("A", 1);

singletonMap.put("B", 2); // Throw UnsupportedOperationException
singletonMap.remove("A"); // Throw UnsupportedOperationException

Map<String, Integer> mutableMap = new HashMap<>(singletonMap);
mutableMap.put("B", 2);  // It works!

Map<String, Integer> immutableMap = Collections.unmodifiableMap(mutableMap);
immutableMap.put("B", 2); // Throw UnsupportedOperationException
mob
关注 私信
文章
61
关注
0
粉丝
0