这是Oracle网站indexOf()
中LinkedList
的示例实现。关于if
循环如何在这里工作,我有点困惑:
public int indexOf(E e) {
for (ListIterator<E> it = listIterator(); it.hasNext(); )
if (e == null ? it.next() == null : e.equals(it.next()))
return it.previousIndex();
// Element not found
return -1;
}
所以ListIterator
对象是在列表的头部创建的。 for
循环继续,直到迭代器到达列表的末尾,if
循环检查是否找到目标对象。我不明白的部分是if
为什么在it.next() == null
时循环检查e == null
?当输入e为空时,有人可以帮助我了解它是如何完成的吗?
答案 0 :(得分:5)
循环检查it.next() == null
是否仅e == null
这样做是为了避免在评估e.equals(it.next())
时出现NullPointerException。
如果e != null
,则调用常规e.equals()
方法。
null
是一个有效的“元素”,可插入LinkedList
,因此必须予以考虑。
未插入最后一个元素的位置。请注意,与链接列表中最后一个元素为null
的教科书数据结构不同,在此处 - 当您到达最后一个元素时 - it.hasNext()
将被评估为false,而不会让您看到此“垃圾”元素。
答案 1 :(得分:0)
如果e
为null
,则indexOf()
方法将迭代,直到它在您传递的可迭代对象中找到另一个null
元素并返回其索引。
答案 2 :(得分:0)
我认为你误解了ternary operator的问题。
这一行:
if (e == null ? it.next() == null : e.equals(it.next()))
检查 e是否为空,如果是,则检查迭代器的下一个元素是否为空(这有效地停止了迭代操作,以便避免使用NullPointerException),否则:(如果e 不为空 - 即它有一些值),执行比较:
e.equals(it.next())
答案 3 :(得分:0)
if (e == null ? it.next() == null : e.equals(it.next()))
- 这是一个java三元运算符
it.next() == null
是一个空检查(返回true或false以查看这是否是最后一个元素)
如果那是真的
return it.previousIndex();
执行
如果e不为null,那么
e.equals(it.next())
执行,如果那是真的,
return it.previousIndex();
执行
这是您想要索引的元素的索引。希望我的解释不会令人困惑。