增强for循环不止是语法上的优雅

今天领导发了一篇文章(关于代码审查的必要性)给我看,里面有几行java片段例子,其中一个关于遍历集合的例子引起来我的注意。

先来看下面的代码片段:


List  alist = new ArrayList();  // 顺序存储方式,通过下标访问元素


// for循环

for(int i = 0 ;i < alist.size(); i++){

System.out.print(alist.get(i));

}

// 增强for循环

for(Object o : alist){

System.out.print(o);

}

从上面的代码貌似看不出for循环和增强for到底哪种循环更优一点,但是基本上程序员都知道遍历元素使用增强for循环,但为什么增强for循环会比for循环更优一点,可能大部分人不能清楚的讲明白(至少我在学习循环的时候是这样的)。

还是上面的代码,我们变一下

// List  alist = new ArrayList();     顺序存储方式,通过下标访问元素

List  alist = new   LinkedList();  // 链表存储方式,通过下标访问元素


// for循环

for(int i = 0 ;i < alist.size(); i++){

System.out.print(alist.get(i));

}

// 增强for循环

for(Object o : alist){

System.out.print(o);

}

当循环的是 LinkedList的时候,用for循环就是非常不明智的选择了,因为链表存储方式并不是真正通过下标去访问元素的,而是通过遍历每个链表节点获取元素的(可取参考链表实现),也就是说如果你是for循环遍历LinkedList,那么就是多重循环(本人也不是很懂算法时间复杂度,就不多作解释),大大的降低了性能,而增强for循环使用的是Iterator来做遍历,所以不管集合是何种存储方式,遍历的开销都是一样的。

简单讲就是不同的数据结构存储方式不一样,需采用不同的算法,而增强for循环则解决了这个问题,避免我们简单粗暴的去遍历集合。如果你不是很清楚的话可先去了解一下java集合的实现、数据结构和算法








你可能感兴趣的:(java循环)