如何使用null键处理迭代中的空指针

时间:2016-06-20 05:54:45

标签: java collections

在最近的一次采访中,我遇到的问题是

  

当迭代器遇到空键时,如何处理空指针   在hashmap上迭代。假设我的开发人员插入了一个   错误的空键

我的回答是:我们需要检查null!=entry.getKey()。 他不满意并且之前说过你将如何处理。

我该如何回答这个问题。当我回来的时候。

我试过这个

public class Main {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();
        map.put(null, "null");
        map.put("null",null);
        map.put("test", "test");

        Iterator<Entry<String, String>> it = map.entrySet().iterator();
        while(it.hasNext()){
            System.out.println(it.next().getKey());
        }
    }
} 

输出:

null
test
null

没有例外。他究竟想问什么。还是我错过了一些概念?请指导我

2 个答案:

答案 0 :(得分:1)

map.remove(null)

来自JavaDocs:

  

返回此映射先前与该键关联的值,如果映射不包含该键的映射,则返回null。

     

如果此映射允许空值,则返回值null不一定表示映射不包含该键的映射;它也可能是映射显式地将键映射为null。

     

一旦调用返回,映射将不包含指定键的映射。

在迭代之前调用它,它将删除显式空键

答案 1 :(得分:-2)

我想他想通过这个问题测试的关键点是在对象next()上调用方法Iterator时会发生什么。

当你想迭代地图时,他可能想知道你是否会按照以下方式进行编程:

Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
      if (null != iter.next().key()) {
         System.out.println(iter.next());
      }
}

如果您按照上面的示例编程,next方法将调用两次,并且您将无法获得您真正想要检查的正确对象。相反,你应该写这样的代码:

Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
      // Key point: define a refreence point to the object returned by the
      // method `next()`
      Entry entry = iter.next();
      if (null != entry.key()) {
         System.out.println(entry);
      }
}