map用entrySet方法做循环遍历时,不指定key-value类型可以么?

  • 定义一个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类型。

发布了178 篇原创文章 · 获赞 180 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104324072
今日推荐