Java 流程控制,实现替换方法列表
直接来自[http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html]Java 流程控制,实现替换方法列表,java,iterator,nullpointerexception,Java,Iterator,Nullpointerexception,直接来自[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
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); }
与集合迭代无关,而是仅在parameters方法中指定val参数
提前感谢您对上述内容的澄清。该测试封装了两个不同的规则,用于在列表中查找val: 如果val为null,那么list元素必须为null,才能调用匹配,列表可以包含null值 如果val不为null,则val必须等于using.equals列表元素,才能有匹配项 如果尝试在val为null时计算val.equalslist.next,则会出现NullPointerException 该方法可以这样编写:
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);
}
}
该测试封装了在列表中查找val的两个不同规则: 如果val为null,那么list元素必须为null,才能调用匹配,列表可以包含null值 如果val不为null,则val必须等于using.equals列表元素,才能有匹配项 如果尝试在val为null时计算val.equalslist.next,则会出现NullPointerException 该方法可以这样编写:
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);
}
}
你对这里发生的事情的理解是绝对正确的:他们所讨论的特殊情况与空值检查参数有关,而不是列表的迭代 事实上,您可以将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);
}
你对这里发生的事情的理解是绝对正确的:他们所讨论的特殊情况与空值检查参数有关,而不是列表的迭代 事实上,您可以将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);
}
我很惊讶列表参数也没有显式检查null…@mre这是一个很好的注释!不必对列表中的元素进行null检查的原因是,contract of Object的equals方法显式允许传递null参数。查看javadoc以了解其他要求。我很惊讶列表参数也没有显式检查null…@mre这是一个很好的注释!不必对列表中的元素进行null检查的原因是,对象的contract的equals方法显式地允许传递null参数。查看javadoc以了解其他需求。