LinkedList的indexOf()vs lastIndexOf()方法优化

时间:2017-03-02 06:49:33

标签: java linked-list

真的想知道为什么链接列表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;
}

是故意的吗?

1 个答案:

答案 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,所以我们必须添加额外条件。