2

直接来自 [http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html]

public static <E> void replace(List<E> list, E val, E newVal) {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (val == null ? it.next() == null : val.equals(it.next()))
            it.set(newVal); }

这个例子中唯一的小技巧是 val 和 it.next 之间的相等性测试。您需要对 null 的 val 值进行特殊处理,以防止出现 NullPointerException。

我想知道为什么我们需要对 null 的 val 值进行特殊处理以防止出现 NullPointerException。我可能理解我们必须保护代码以防止 NullPointerException 但是那行代码

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

与集合迭代无关,而是仅在parameters方法中指定了val参数。

提前感谢您对上述内容的任何澄清。

4

2 回答 2

2

该测试封装了两个不同的定位val规则list

  1. 如果valnull,则列表元素必须是null匹配的(回想一下列表可以包含null值)
  2. 如果val不是null,则val必须等于(使用.equals())列表元素才能匹配

NullPointerException如果您尝试评估val.equals(list.next())when valis ,则会出现null

该方法可以这样写:

public static <E> void replace(List<E> list, E val, E newVal) {
    if (val == null) {
        for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
            if (it.next() == null)
                it.set(newVal);
    } else {
        for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
            if (val.equals(it.next()))
                it.set(newVal);
    }
}
于 2013-03-24T16:24:00.170 回答
2

您对这里发生的事情的阅读是绝对正确的:他们所说的“特殊情况”与对参数进行空值检查有关,而不是与列表的迭代有关。

实际上,您可以将if语句移到循环之外以获得更高效但可读性更低的解决方案:

if (val != null) {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (val.equals(it.next()))
            it.set(newVal);
} else {
    for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
        if (it.next() == null)
            it.set(newVal);
}
于 2013-03-24T16:24:34.837 回答