概述
最近看到项目上有这样的语句
Iterator it = list.iterator();
while (it.hasNext()) {
objects = (Object[]) iter.next();
}
瞬间感觉比起自己的for循环语句高端大气了不少,但此刻又有疑问,到底这两种那种比较好
先拿出for循环来对比
for(int i=0;i <list.size();i++){
objects = (Object[])list.get(i);
}
经过查询,查到了很多,现在来分享一下
一方面从简洁程度和可复用的角度,迭代器的方法必然比较轻松 ,比如当前list的组织结构变化,不能用get()函数获取,则需要重新更改for循环代码,而迭代器不用,故这是开发爱好者比较喜欢的一种代码方式
至于效率方面,找到了一位大神的测试分析http://bbs.csdn.net/topics/250025827
现在拷贝一些关键数据
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
/**
* IteratorTest
* @author SageZk
*/
public class IteratorTest {
public static long testForloops(List<String> list) {
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start = System.nanoTime();
for (int i = list.size() - 1; i >= 0; --i) {
le = list.get(i);
}
end = System.nanoTime();
return end - start;
}
public static long testIterator(List<String> list) {
long start = 0L, end = 0L;
@SuppressWarnings("unused")
String le = null;
start = System.nanoTime();
Iterator<String> it = list.iterator();
while (it.hasNext()) {
le = it.next();
}
end = System.nanoTime();
return end - start;
}
public static void main(String[] args) {
//测试列表长度
final int LEN = 10000;
//初始化测试用数据
List<String> arraylist = new ArrayList<String>();
List<String> linkedlist = new LinkedList<String>();
for (int i = 0; i < LEN; ++i) {
String s = Integer.toString(i, 2);
arraylist.add(s);
linkedlist.add(s);
}
//打印测试结果
final String FORMAT = "%1$-16s%2$-16s%3$16dn";
System.out.println("ListttTypettTime(nanoseconds)");
System.out.println("-------------------------------------------------");
System.out.printf(FORMAT, "ArrayList", "for", testForloops(arraylist));
System.out.printf(FORMAT, "ArrayList", "Iterator", testIterator(arraylist));
System.out.printf(FORMAT, "LinkedList", "for", testForloops(linkedlist));
System.out.printf(FORMAT, "LinkedList", "Iterator", testIterator(linkedlist));
}
}
以下是 3 组测试结果:
[code=BatchFile]List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1189258
ArrayList Iterator 2365594
LinkedList for 152396254
LinkedList Iterator 2340801
List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1235701
ArrayList Iterator 4249982
LinkedList for 149825606
LinkedList Iterator 2525531
List Type Time(nanoseconds)
-------------------------------------------------
ArrayList for 1198267
ArrayList Iterator 2584617
LinkedList for 150382451
LinkedList Iterator 2347994
[/code]
这里可以看出当用linkedlist的方式时用iterator明显好很多
这时又有人提出,可以用foreach来编写,这样更加简略
List <String> list = new ArrayList <String>();
for (String s:list) {
System.out.println(s);
}
这时,本着比对的态度,网上进行了查阅,首先从java forEach实现原理可以参见下文http://blog.csdn.net/a596620989/article/details/6930479
我们可以看到foreach其实就是迭代器,而且多加了一个一个检查
但foreach又有什么坏处呢
通过http://lavasoft.blog.51cto.com/62575/53321/
我们可以看到结论:
foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了。在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用for语句的时候了。
最后
以上就是热心大船为你收集整理的iterator 遍历与for循环与foreach的优劣对比的全部内容,希望文章能够帮你解决iterator 遍历与for循环与foreach的优劣对比所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复