真的想知道为什么链接列表indexof()没有利用“header”条目在传递null“target”时具有提高性能的null元素这一事实:
public int indexOf(Object o) {
int index = 0;
if (o==null) {
// header.element guaranteed null, no chance of looping past header
for (Entry e = header.next; e.element != null; e = e.next) {
index++;
}
// if index < size, null was found, else we looped to header
return (index < size) ? index: -1;
} else {
for (Entry e = header.next; e != header; e = e.next) {
if (o.equals(e.element))
return index;
index++;
}
}
return -1;
}
如果我们对lastIndexOf()应用类似的转换,它会产生非常漂亮的结果:
public int lastIndexOf(Object o) {
int index = size - 1;
if (o==null) {
for (Entry e = header.previous; e.element != null;
e = e.previous, index--);
} else {
for (Entry e = header.previous; e != header && !o.equals(e.element);
e = e.previous, index--);
}
return index;
}
是故意的吗?
答案 0 :(得分:1)
我不确定你指的是什么JRE,但除了语法糖,我看到的唯一相关区别是:
// if index < size, null was found, else we looped to header
return (index < size) ? index: -1;
原因是,对于lastIndexOf()
,我们从最后一个元素开始,一旦失败,我们最终会在带有索引-1
的标题处开始。但是对于indexOf()
,我们从第0个元素开始,一旦错过,我们最终会在index == size
的标题处结束 - 但是,我们想要在未命中时返回-1
,所以我们必须添加额外条件。