- 定义一个LinkedHashMap:
Map<Integer, List<Integer>> listMap = new LinkedHashMap<>();
- 先不指定key-value类型进行遍历:
可以发现这样取值,返回结果都是Object类型,还得进行一步转换才能匹配原先定义的类型。
- 指定key-value类型进行遍历:
发现这时可以直接用原来定义的类型去做接收返回结果了。
分析下原因:
以下是Map.Entry的具体实现,可以发现返回结果是个Entry对象,是个静态内部类,它的key-value都采用了泛型。
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}
继续跟下去,找到Entry对象的getKey()方法和getValue()方法:
interface Entry<K,V> {
K getKey();
V getValue();
}
可以发现Entry里定义的泛型<K,V>其实分别对应着getKey()和getValue()的返回值类型
总结
这时就可以明白了,在用entrySet方法做循环遍历时,如果为Entry对象的<K,V>指定了相关的具体类型,那么他们对应方法的返回值类型也会一样被定义,这样就能用实际类型去接收返回值,而不是默认的Object类型,避免了转型这步操作。
所以如果map用entrySet方法做循环遍历,最好指定key-value类型。