概述
本文将探讨在Java中初始化空Map
的不同方法。我们将使用Java 8和Java 9来展示这些不同的方式。
2. 使用Java集合库
我们可以使用Java集合库提供的emptyMap()
方法创建一个空的Map
。这将生成一个可序列化的空Map
。该方法在Java 1.5的Collections库中引入。这将创建一个不可变的Map
:
Map<String, String> emptyMap = Collections.emptyMap();
注意:由于创建的Map
是不可变的,用户无法向其中添加任何条目或对Map
进行任何类型的修改。尝试在Map
中添加或修改任何键值对时,它会抛出java.lang.UnsupportedOperationException
。
我们还有另外两个方法支持空Map
的创建和初始化。**emptySortedMap()
返回一个不可变的空SortedMap
。**SortedMap
是一种提供其键进一步总排序的Map
。这个方法创建的Map
也是可序列化的:
SortedMap<String, String> sortedMap = Collections.emptySortedMap();
Java集合库提供的另一个方法是emptyNavigableMap()
,它返回一个空的NavigableMap
。它的属性与空排序Map
相同。唯一的区别是此方法返回一个可导航的Map
。NavigableMap
是传统排序Map
实现的扩展,可以为给定搜索目标找到最接近的匹配。
NavigableMap<String, String> navigableMap = Collections.emptyNavigableMap();
上述所有方法返回的Map
都是不可变的,我们无法向这些Map
添加新条目。尝试强制添加、删除或修改任何键值对时,它们会抛出UnsupportedOperationException
。
3. 使用构造函数初始化Map
我们可以使用不同Map
实现的构造函数(如HashMap
、LinkedHashMap
和TreeMap
)初始化Map
。所有这些初始化都会创建一个空的Map
,如果需要,我们可以在稍后添加条目:
Map hashMap = new HashMap();
Map linkedHashMap = new LinkedHashMap();
Map treeMap = new TreeMap();
上述Map
是可变的,可以接受新的条目,这是使用这种方法的一个优点。这种初始化类型创建的Map
是空的。我们可以在代码的静态块中定义空Map
。
4. Java 9中的新方法:Map.of()
Java 9引入了许多新功能,如接口私有方法、匿名类、平台模块系统等。**Map.of()
是Java 9版本中引入的工厂方法。**这个方法返回一个不可变的Map
,创建零映射。此方法提供的接口位于Java集合框架中。Map.of(key1, value1, key2, value2, ...)
最多只能有10个键值对。
为了初始化一个空Map
,我们不会在这个方法中传递任何键值对:
Map<String, String> emptyMapUsingJava9 = Map.of();
这个工厂方法产生的Map
是不可变的,因此我们无法添加、删除或修改任何键值对。在初始化后尝试对Map
进行任何更改时,它会抛出UnsupportedOperationException
。添加或删除键值对也不被支持,会引发上述异常。
注意:Java 9的Map.of()
方法简化了使用所需键值对初始化不可变Map
的过程。
5. 使用Guava库
到目前为止,我们已经了解了使用核心Java初始化空Map
的不同方法。现在让我们看看如何使用Guava库初始化Map
:
Map<String, String> articles = ImmutableMap.of();
以上方法使用Guava库创建了一个不可变的空Map
。
在某些情况下,我们不需要不可变Map
。我们可以使用Maps
类初始化一个可变的Map
:
Map<String, String> emptyMap = Maps.newHashMap();
这种初始化方式创建了一个可变的Map
,即我们可以向其中添加条目。但是,Map
的基本初始化是空的,不包含任何条目。
我们还可以根据特定的键和值类型初始化Map
。这将创建具有预定义元素类型的Map
,如果不遵循,将抛出异常:
Map genericEmptyMap = Maps.<String, Integer>newHashMap();
简而言之,这将创建一个键为字符串、值为整数的空Map
。用于初始化的角括号语法称为 Diamond Syntax
。这将创建具有定义的类型参数的Map
,并调用Maps
类的构造函数。
我们也可以使用以下语法在Guava中创建可变的Map
:
Map<String, String> emptyMapUsingGuava = Maps.newHashMap(ImmutableMap.of());
总之,上述方法在Java中创建了一个空Map
。由于它是可变的,我们可以向其中添加条目。
ImmutableMap.of()
也有用于创建带有条目的Map
的重载方法。由于我们正在创建一个空Map
,我们不需要在方法括号内传递任何参数来使用重载方法。
7. 结论
在这篇文章中,我们探讨了初始化空Map
的不同方法。自Java 9以来,这个领域有了显著的进步。我们有了创建和初始化Map
的新工厂方法。
一如既往,完整的源代码可在GitHub上获取。