Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在什么场景下,Map.entrySet返回的Map.Entry将为NULL_Java_Dictionary_Hashmap_Entryset - Fatal编程技术网

Java 在什么场景下,Map.entrySet返回的Map.Entry将为NULL

Java 在什么场景下,Map.entrySet返回的Map.Entry将为NULL,java,dictionary,hashmap,entryset,Java,Dictionary,Hashmap,Entryset,我遇到了一个代码片段,它使用一个映射的条目集在映射上进行迭代,并且只执行一些操作if entry!=空 据我所知,即使我们没有在mapmap中输入任何内容,entrySet也会返回一个空集,而不是null。 即使我放置{null,null},条目也将是[null=null],即包含这些元素的实例。但实例不会为null Map<String, String> map = new HashMap<String, String>(); map.put(null,

我遇到了一个代码片段,它使用一个映射的条目集在映射上进行迭代,并且只执行一些操作if entry!=空

据我所知,即使我们没有在map
map中输入任何内容,entrySet
也会返回一个空集,而不是
null
。 即使我放置
{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
            }

        }
Map Map=newhashmap();
map.put(null,null);
map.put(string1,string1);
对于(Map.Entry:Map.entrySet()){
if(条目!=null){
//做点什么
}
}
我有以下基本问题:

  • 在什么情况下HashMap中的条目将为空
  • 支票有效吗

  • 我坚信
    if(entry!=null)
    过于谨慎,应该删除它。我只是想确定一下。

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

    检查可能只是为了检查映射是否实例化,以避免进一步引用对象时出现
    NullPointerException


    如果您认为这是出于谨慎,那么最好确保映射已在构造函数中实例化,该场景无效。这是hashmap实现中的代码

    private Set<Map.Entry<K,V>> entrySet0() {
        Set<Map.Entry<K,V>> es = entrySet;
        return es != null ? es : (entrySet = new EntrySet());
    }
    
    private Set entrySet0(){
    集合es=入口集合;
    返回es!=null?es:(entrySet=newentryset());
    }
    

    因此,您不应该得到空值,检查显然是多余的@卡亚曼的回答很好。
    但是,我不同意你的评论和@bobK的回答

    我想你可能把入口和入口弄混了。检查与方法
    entrySet()
    的imp无关。方法
    entrySet()
    只是确保entrySet不为null,而示例中的判断是确保集合中的条目不为null

    集合能够包含空对象,因此有时我们需要进行NPE保护。我们不需要在这里进行检查的原因是Map类确保entry集中的条目不为null。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();
            }
        }
    

    public final void forEach(consumer)检查可能只是为了检查对象是否已初始化以处理NullPointerException。请查看此答案,谢谢..为了补充您的答案,当我在自己的文章中挖掘时,从“HashMap.java”
    public Set entrySet(){return entrySet0();}private Set entrySet0(){Set es=entrySet;return es!=null?es:(entrySet=new entrySet());}
    它永远不会返回null值。它与正在实例化的映射无关。