Java 在什么场景下,Map.entrySet返回的Map.Entry将为NULL
我遇到了一个代码片段,它使用一个映射的条目集在映射上进行迭代,并且只执行一些操作if entry!=空 据我所知,即使我们没有在mapJava 在什么场景下,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,
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){
//做点什么
}
}
我有以下基本问题:
我坚信
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值。它与正在实例化的映射无关。