0

这是Oracle 网站上的indexOf()in示例实现。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 为空时,有人可以帮助我了解它是如何完成的吗?

4

4 回答 4

5

循环检查是否it.next() == null只有e == null这样做是为了在评估时避免 NullPointerException e.equals(it.next())

如果e != null,则调用常规e.equals()方法。

null是可以插入到 a 的有效“元素” LinkedList,因此必须考虑到这一点。

不插入最后一个元素的位置。请注意,与链接列表中的最后一个元素为 的教科书数据结构不同null,在这里 - 当您到达最后一个元素时 -it.hasNext()将被评估为 false,而不会让您看到这个“垃圾”元素。

于 2012-10-15T23:05:58.093 回答
0

如果enull,该indexOf()方法将进行迭代,直到null在您传递的可迭代对象中找到另一个元素并返回其索引。

于 2012-10-15T23:05:18.070 回答
0

我认为您误解了三元运算符的情况。

这一行:

if (e == null ? it.next() == null : e.equals(it.next()))

检查e 是否为 null,如果是,那么它将检查迭代器的下一个元素是否为 null(这有效地停止了迭代操作以避免NullPointerException),否则:(如果 e不为 null - 即它有其中一些值),执行比较:

e.equals(it.next())
于 2012-10-15T23:08:48.237 回答
0

if (e == null ? it.next() == null : e.equals(it.next()))- 这是一个java三元运算符

it.next() == null是否为空检查(返回真或假以查看这是否是最后一个元素)如果为真

return it.previousIndex();执行

如果 e 不为空,则

e.equals(it.next())

执行,如果那是真的,

return it.previousIndex();执行

这是您想要索引的元素的索引。希望我的解释不会令人困惑。

于 2012-10-15T23:12:16.643 回答