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)。