LinkedList实现Java-get(int-index)-解释此代码的作用

LinkedList实现Java-get(int-index)-解释此代码的作用,java,linked-list,Java,Linked List,java中使用索引从链表中获取元素的源代码 public E get(int index) { checkElementIndex(index); return node(index).item; } 以及node()的代码 节点(int索引){ //断言isElementIndex(索引); 如果(索引>1)){ 节点x=第一; 对于(int i=0;iindex;i--) x=x.prev; 返回x; } } 我不明白为什么在if条件下使用位移位运算符。有人能解释一下吗?

java中使用索引从链表中获取元素的源代码

public E get(int index) {
    checkElementIndex(index);
    return node(index).item;
}
以及node()的代码

节点(int索引){
//断言isElementIndex(索引);
如果(索引<(大小>>1)){
节点x=第一;
对于(int i=0;iindex;i--)
x=x.prev;
返回x;
}
}

我不明白为什么在if条件下使用位移位运算符。有人能解释一下吗?

术语
size>>1
相当于使用
size/2
。也就是说,如果索引位于列表的左侧,将执行
if
条件。否则,将使用
else
条件


这里的逻辑是一种简单的分而治之的方法:它保证了对于项目数为
size
的列表,代码最多只需遍历
size/2
个项目。根据索引,搜索将从列表的末尾或列表的开头开始。

术语
size>>1
相当于使用
size/2
。也就是说,如果索引位于列表的左侧,将执行
if
条件。否则,将使用
else
条件


这里的逻辑是一种简单的分而治之的方法:它保证了对于项目数为
size
的列表,代码最多只需遍历
size/2
个项目。根据索引的不同,搜索将从列表的末尾或列表的开头开始。

size>>1从技术上讲是size/2

因此,如果索引小于大小,则链表将从头到尾迭代以获取元素

如果索引大于大小,则链表将从最后一个到第一个进行迭代以获取元素

如果列表有1000个元素

如果我们尝试获取索引1处的元素 那么总迭代次数将是2

如果我们试图得到索引998处的元素,那么总迭代次数将是2。 而不是重复998次


因此,这里我们使用到元素的最短路径。

大小>>1从技术上讲是大小/2

因此,如果索引小于大小,则链表将从头到尾迭代以获取元素

如果索引大于大小,则链表将从最后一个到第一个进行迭代以获取元素

如果列表有1000个元素

如果我们尝试获取索引1处的元素 那么总迭代次数将是2

如果我们试图得到索引998处的元素,那么总迭代次数将是2。 而不是重复998次


因此,我们在这里使用到元素的最短路径。

使用>>比普通整数除法有什么特别的优势吗?@SujayDSa在引擎盖下,
size/2
size>>1
可能已经针对相同的问题进行了优化。您可能会读到,在您自己的代码中,您可能应该避免使用位移位运算符,除非您真的打算进行位移位(这里的情况并非如此,因此请使用除法)。使用>>比普通整数除法有什么特殊优势吗?@SujayDSa,
size/2
size>>1
可能已经针对相同的问题进行了优化。您可能会读到,在您自己的代码中,您可能应该避免使用bitshift运算符,除非您真的打算进行位移位(这里的情况并非如此,所以请使用divide)。
Node<E> node(int index) {
    // assert isElementIndex(index);

    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}