繁体   English   中英

在什么情况下,map.entrySet返回的Map.Entry将为NULL

[英]Under what scenario Map.Entry returned by map.entrySet will be NULL

我遇到了一个代码片段,它使用其入口集迭代地图,并仅在entry!= null时执行一些操作

据我所知,即使我们没有在map map.entrySet输入任何内容, map.entrySet返回一个空集而不是null 即使我放置{null,null}该条目也将是[null=null]即具有这些元素的实例。 但实例不会为空。

Map<String, String> map = new HashMap<String, String>();
        map.put(null, null);
        map.put(string1, string1);
        for(Map.Entry<String, String> entry : map.entrySet()){
            if(entry != null){
                                  //do something
            }

        }

我有以下基本问题:

  1. 在什么情况下HashMap中的条目将为NULL?
  2. 支票甚至有效

我强烈相信if(entry != null)过于谨慎,应该将其删除。我只想确定。

迭代器可以为支持空值的集合返回null,但正如您自己所示,这对于Maps是不可能的。 检查是多余的和误导性的。

该方案无效。 这是hashmap实现的代码

private Set<Map.Entry<K,V>> entrySet0() {
    Set<Map.Entry<K,V>> es = entrySet;
    return es != null ? es : (entrySet = new EntrySet());
}

所以,你不应该得到一个空值

检查显然是多余的。 @Kayaman的回答很好。
但是,我不同意你的评论和@ bobK的回答。

我想你可能会混入entry和entrySet。 该检查与方法entrySet()的imp无关。方法entrySet()只是确保entrySet不为null,而示例中的判断是确保Set中的条目不为null。

Set能够包含一个null对象,因此有时我们需要进行NPE保护。 我们不需要在这里进行检查的原因是Map类确保条目集中的条目不为空。 EntrySet类中的forEach()方法是重要的方法。

    public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
        Node<K,V>[] tab;
        if (action == null)
            throw new NullPointerException();
        if (size > 0 && (tab = table) != null) {
            int mc = modCount;
            for (int i = 0; (i < tab.length && modCount == mc); ++i) {
                for (Node<K,V> e = tab[i]; e != null; e = e.next)
                    //e is not null
                    action.accept(e);
            }
            if (modCount != mc)
                throw new ConcurrentModificationException();
        }
    }

这里确保了e != null

检查可以在那里检查Map是否被实例化以避免在对对象的进一步引用中出现NullPointerException
如果您认为这是为了谨慎,则最好确保已在构造函数中实例化Map

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM