是Java';s LinkedList优化为在必要时反向获取(索引)?

是Java';s LinkedList优化为在必要时反向获取(索引)?,java,performance,data-structures,linked-list,Java,Performance,Data Structures,Linked List,我一直在研究一些优化LinkedList的方法。有人知道Java默认的双链接LinkedList类是否经过优化,以执行相反的get()操作吗? 例如: // Some LinkedList list that exists with n elements; int half = list.size() / 2; list.get(half + 1); 调用list.get(half+1)是否会优化搜索并反向执行,因为它是一个双链接列表?如果您知道元素位于列表的后半部分,那么从末尾开始搜索并向中

我一直在研究一些优化LinkedList的方法。有人知道Java默认的双链接LinkedList类是否经过优化,以执行相反的
get()
操作吗? 例如:

// Some LinkedList list that exists with n elements;
int half = list.size() / 2;
list.get(half + 1);
调用
list.get(half+1)
是否会优化搜索并反向执行,因为它是一个双链接列表?如果您知道元素位于列表的后半部分,那么从末尾开始搜索并向中间搜索会更有意义


我知道使用
get(index)
O(n)
时间,在遍历链接列表时应该使用迭代器,但我只是好奇。

是的。您可以自己检查源代码:

LinkedList#get(int)
实现为

return entry(index).element;
其中,
entry
是一个私有方法<代码>条目的定义是:

private Entry<E> entry(int index) {
    if (index < 0 || index >= size)
        throw new IndexOutOfBoundsException("Index: "+index+
                                            ", Size: "+size);
    Entry<E> e = header;
    if (index < (size >> 1)) {
        for (int i = 0; i <= index; i++)
            e = e.next;
    } else {
        for (int i = size; i > index; i--)
            e = e.previous;
    }
    return e;
}
private条目(int索引){
如果(索引<0 | |索引>=大小)
抛出新IndexOutOfBoundsException(“索引:”+索引+
,大小:“+大小);
条目e=标题;
如果(索引<(大小>>1)){
对于(int i=0;i索引;i--)
e=e.先前;
}
返回e;
}

如您所见,如果索引大于列表的中点,则从末尾开始倒计时。

就在javadocs的第三段(Java 7的第二段):
索引到列表的操作将从开始或结束遍历列表,以最接近指定索引的为准。
请注意,从性能角度来看,LinkedList的大多数使用都是错误的。