Java中的泛型映射

时间:2020-01-09 10:36:00  来源:igfitidea点击:

Java的Map界面(java.util.Map)可以被泛化。换句话说,我们可以在通用的Map实例中设置键和值的特定类型。这是一个例子:

Map<Integer, String> set = new HashMap<Integer, String>;

这个Map只能接受Integer实例作为键,而String实例作为值。

通用类型检查仅在编译时存在。在运行时,可以调整代码,以便可以插入其他实例。不过,这是一个坏主意。

访问泛型映射

就像我们一直以来所做的那样,使用put()和get()方法完成向通用Map中添加元素和获取元素的操作:

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

Integer key1   = new Integer(123);
String  value1 = "value 1";

map.put(key1, value1);

String value1_1 = map.get(key1);

那么,最大的区别是什么?好吧,如果我们尝试在上面的示例中将不是"整数,字符串"对实例的键,值对添加到"映射"中,则编译器会抱怨。这是一个非常不错的额外类型检查。

还要注意,没有必要强制转换get()方法返回的String实例。编译器知道此Map具有String值,因此不需要强制转换。

我们还可以使用Java 5的新自动装箱函数来简化" Integer"值的指定,如下所示:

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

Integer key1   = 123;
String  value1 = "value 1";

map.put(key1, value1);

//or

map.put(123, value1);

String value1_1 = map.get(123);

迭代泛型映射

一个Map有两个可以迭代的集合。键" Set"和值" Set"。大多数情况下,我们会迭代" Set"键,并通过" Map.get()"方法访问每个键的值。

这是两个示例:

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

//... add key, value pairs to the Map

// iterate keys.
Iterator<Integer> keyIterator   = map.keySet().iterator();

while(keyIterator.hasNext()){
  Integer aKey   = keyIterator.next();
  String  aValue = map.get(aKey);
}

Iterator<String>  valueIterator = map.values().iterator();

while(valueIterator.hasNext()){
  String aString = valueIterator.next();
}

注意,没有必要强制转换从下一次调用iterator.next()返回的对象。因为Map是泛型的(具有类型),所以编译器知道它包含键的Integer实例和值的String实例。因此,即使对象来自其"迭代器"之一,也不必转换从"地图"获取的对象。

我们还可以使用新的for循环,如下所示:

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

//... add key, value pairs to the Map

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

for(String aValue : map.values()) {
    System.out.println(aValue);
}

注意在每个for循环的括号内如何声明一个Integer和一个String变量。对于每次迭代(" Map"键集或者值集合中的每个元素),此变量都包含当前元素(当前Integer或者String)。