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