LinkedList实现Java-get(int-index)-解释此代码的作用
java中使用索引从链表中获取元素的源代码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条件下使用位移位运算符。有人能解释一下吗?
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;
}
}