什么情况下map.entrySet返回的Map.Entry会是NULL
Under what scenario Map.Entry returned by map.entrySet will be NULL
我遇到了一个代码片段,它使用条目集遍历地图并仅执行一些操作 if entry != null
据我所知,即使我们不在地图中输入任何内容 map.entrySet
returns 一个空集而不是 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
}
}
我有以下基本问题:
- HashMap中的条目在什么情况下会为NULL?
- 支票是否有效
我坚信 if(entry != null)
过度谨慎,应该 removed.I 只是想确定一下。
对于支持空值的集合,迭代器可以 return 空值,但正如您自己所表明的那样,这对于 Maps
是不可能的。该支票是多余的且具有误导性。
检查可能只是为了检查 Map 是否已实例化,以避免 NullPointerException
进一步引用该对象。
如果您认为这是为了谨慎起见,您最好确保 Map 已在构造函数中实例化
场景无效。这是哈希图实现中的代码
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中的条目不为空.
Set可以包含一个null对象,所以有时候我们需要做NPE保护。这里我们不需要做检查的原因是MapClass保证entry set中的entry不为null。 EntrySetclass中的方法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
这里是有保障的。
我遇到了一个代码片段,它使用条目集遍历地图并仅执行一些操作 if entry != null
据我所知,即使我们不在地图中输入任何内容 map.entrySet
returns 一个空集而不是 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
}
}
我有以下基本问题:
- HashMap中的条目在什么情况下会为NULL?
- 支票是否有效
我坚信 if(entry != null)
过度谨慎,应该 removed.I 只是想确定一下。
对于支持空值的集合,迭代器可以 return 空值,但正如您自己所表明的那样,这对于 Maps
是不可能的。该支票是多余的且具有误导性。
检查可能只是为了检查 Map 是否已实例化,以避免 NullPointerException
进一步引用该对象。
如果您认为这是为了谨慎起见,您最好确保 Map 已在构造函数中实例化
场景无效。这是哈希图实现中的代码
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中的条目不为空.
Set可以包含一个null对象,所以有时候我们需要做NPE保护。这里我们不需要做检查的原因是MapClass保证entry set中的entry不为null。 EntrySetclass中的方法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
这里是有保障的。