概述
首先先回答下上面的问题,答案是迭代器,那么很多人就想问下为什么,往下看
@Test
public void get() {
List<Integer> ll = new LinkedList<>();
for (int i=0; i<100000; ++i) {
ll.add(i);
}
long start = System.currentTimeMillis();
for (int i=0; i<ll.size(); ++i) {
ll.get(i);
}
long end = System.currentTimeMillis();
Iterator iterator = ll.iterator();
while(iterator.hasNext()) {
iterator.next();
}
long time = System.currentTimeMillis();
System.out.println("使用for循环,所花费的时间: " + (end - start));
System.out.println("使用迭代器,所花费的时间: " + (time - end));
}
从上图的运行结果可以明显地看出来差异啦,迭代器要快,那这个是为啥呢,咱们继续往下看
//这个是使用for循环遍历数据的时候,对应的底层实现,我们可以看到,首先会先根据当前的index,来判断是从前往后遍历,还是从后往前遍历,无论是从前开始还是从后开始遍历,里面都是要走一个for循环,直到走到对应的下标node,然后返回对应的node值
LinkedList.Node<E> node(int index) {
LinkedList.Node x;
int i;
if (index < this.size >> 1) {
x = this.first;
for(i = 0; i < index; ++i) {
x = x.next;
}
return x;
} else {
x = this.last;
for(i = this.size - 1; i > index; --i) {
x = x.prev;
}
return x;
}
}
//下面这个是使用迭代器遍历的时候,对应的next方法,从这个方法中我们可以明显地看出来,并没有从前往后或者从后往前的循环遍历,所以迭代器遍历的速度要比for循环快
public E next() {
this.checkForComodification();
if (!this.hasNext()) {
throw new NoSuchElementException();
} else {
this.lastReturned = this.next;
this.next = this.next.next;
++this.nextIndex;
return this.lastReturned.item;
}
}
综上所述,for循环最主要的遍历瓶颈其实就是,每次通过下标进行访问的时候,都需要遍历链表
最后
以上就是自然樱桃为你收集整理的LinkedList中的for循环和迭代器,哪个遍历效率高的全部内容,希望文章能够帮你解决LinkedList中的for循环和迭代器,哪个遍历效率高所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复