Java如何创建泛型Map对象?

在这个Java泛型示例中,您将看到如何创建泛型Map对象。创建通用Map意味着您可以定义键的类型和存储在中的对象的值的类型Map。通用Map的声明和实例化仅与其他类型的集合不同,例如ListandSet是我们定义了两种类型。键的一种类型,值的另一种类型。

创建通用Map的语法如下:

Map<K, V> map = new Map<K, V>();

哪里K是映射键V的类型,是映射中存储的值的类型。如果要让映射保存对Stringobject的引用值并使用Integer键作为键,则将编写声明和实例化,如下面的代码片段所示。

Map <Integer, String> map = new HashMap<Integer, String>();

为了使其更简单,您也可以使用菱形运算符。

Map <Integer, String> map = new HashMap<>();

当您想向映射添加一些元素时,可以使用相同的put()方法。但是您不必担心在映射中放置了错误类型的对象。因为Java编译器将对其进行检查,以查看您是否存储了正确的类型。泛型将捕获在运行时不应发生的错误,因为代码已在编译时进行了验证。

Map <Integer, String> map = new HashMap<>();
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");

//map.put("4", new Date()); // 编译时错误!  

String a = map.get(1);
String b = map.get(2);
String c = map.get(3);

get()方法将从映射中返回与给定键对应的值。因为映射知道它存储字符串值,所以它将返回一个字符串。因此,您无需从映射的get()方法强制转换返回值。您可能想知道为什么我们可以放置像1、2、3这样的键Integer?如果您还记得自动装箱功能,那么您会理解的。在屏幕后面,Java会将原语转换int为Integer。

现在,在我们知道如何添加元素并从映射上读回元素之后。让我们迭代映射的内容。映射将具有两个可以迭代的集合,即键和值。下面的代码段将为您演示。第一个代码段向您展示如何使用键集合迭代映射,而第二个代码段则迭代映射的值。

迭代键集合。

Iterator keyIterator = map.keySet().iterator();
while (keyIterator.hasNext()) {
    Integer key = keyIterator.next();
    String value = map.get(key);
    System.out.println("key = " + key + "; value = " + value);
}

当使用键集合迭代映射时,您将获得映射的键集,并检查hasNext()以查看它是否有next键。之后,可以使用next()方法获取键。要获取值,可以调用get()方法并将键作为参数传递。

迭代值集合。

Iterator valueIterator = map.values().iterator();
while(valueIterator.hasNext()) {
    System.out.println("value = " + valueIterator.next());
}

如果要迭代该值并忽略键,则可以从映射中获取值集合。验证它是否仍然包含更多值,您可以调用hasNext()方法。要获取值,只需从迭代器调用next()方法。

请注意,当使用泛型映射时,不需要进行任何类型转换。将所有内容添加到map,并根据键的类型和map的值从map读取。除了使用迭代器之外,还可以使用for-each循环来迭代映射。下面是使用for-each循环编写的上述代码的版本。

for (Integer key : map.keySet()) {
    String value = map.get(key);
    System.out.println("key = " + key + "; value = " + value);
}

for (String s : map.values()) {
    System.out.println("value = " + s);
}

您可以选择与您的编码样式匹配的任何一种方式。两种迭代映射对象的方法都会产生相同的结果。