在最近的一次采访中,我遇到的问题是
当迭代器遇到空键时,如何处理空指针 在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
没有例外。他究竟想问什么。还是我错过了一些概念?请指导我
答案 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);
}
}