package Test;import java.util.ArrayList;
import java.util.Iterator;public class IteratorTime {
public static void main(String[] args){
final int LENGTH = 10;
ArrayList list = new ArrayList();
for(int i = 0; i < LENGTH; i++){
list.add(i, new Integer(i));
}
System.out.println("the size of ArrayList is " + LENGTH);
long start = System.currentTimeMillis();
int length = list.size();
for(int i = 0; i < length; i++){
//System.out.print(list.get(i).toString()+"\t");
}
long end = System.currentTimeMillis();
System.out.println("内部遍历用时:" + (end-start) + "ms");
//System.out.println("");
start = System.currentTimeMillis();
Iterator it = list.iterator();
while(it.hasNext()){
it.next();
//System.out.print(it.next().toString()+"\t");
}
end = System.currentTimeMillis();
System.out.println("Iterator遍历用时:" + (end-start) + "ms");
}
}
import java.util.Iterator;public class IteratorTime {
public static void main(String[] args){
final int LENGTH = 10;
ArrayList list = new ArrayList();
for(int i = 0; i < LENGTH; i++){
list.add(i, new Integer(i));
}
System.out.println("the size of ArrayList is " + LENGTH);
long start = System.currentTimeMillis();
int length = list.size();
for(int i = 0; i < length; i++){
//System.out.print(list.get(i).toString()+"\t");
}
long end = System.currentTimeMillis();
System.out.println("内部遍历用时:" + (end-start) + "ms");
//System.out.println("");
start = System.currentTimeMillis();
Iterator it = list.iterator();
while(it.hasNext()){
it.next();
//System.out.print(it.next().toString()+"\t");
}
end = System.currentTimeMillis();
System.out.println("Iterator遍历用时:" + (end-start) + "ms");
}
}
内部遍历用时:0ms
Iterator遍历用时:0msthe size of ArrayList is 100:
内部遍历用时:0ms
Iterator遍历用时:0msthe size of ArrayList is 10000:
内部遍历用时:0ms
Iterator遍历用时:10msthe size of ArrayList is 100000:
内部遍历用时:0ms
Iterator遍历用时:20msthe size of ArrayList is 1000000:
内部遍历用时:0ms
Iterator遍历用时:120ms
你大约可以看出差距
import java.util.Iterator;public class IteratorTime {
public static void main(String[] args){
final int LENGTH = 1000000;
ArrayList list = new ArrayList();
for(int i = 0; i < LENGTH; i++){
list.add(i, new Integer(i));
}
System.out.println("the size of ArrayList is " + LENGTH + ": ");
long start = System.currentTimeMillis();
int length = list.size();
for(int i = 0; i < length; i++){
list.get(i);
//System.out.print(list.get(i).toString()+"\t");
}
long end = System.currentTimeMillis();
System.out.println("内部遍历用时:" + (end-start) + "ms");
//System.out.println("");
start = System.currentTimeMillis();
Iterator it = list.iterator();
while(it.hasNext()){
it.next();
//System.out.print(it.next().toString()+"\t");
}
end = System.currentTimeMillis();
System.out.println("Iterator遍历用时:" + (end-start) + "ms");
}
}
the size of ArrayList is 100: 内部遍历用时:0msIterator遍历用时:0ms
the size of ArrayList is 1000: 内部遍历用时:0msIterator遍历用时:0ms
the size of ArrayList is 10000: 内部遍历用时:0msIterator遍历用时:0ms
the size of ArrayList is 100000: 内部遍历用时:0msIterator遍历用时:21ms
the size of ArrayList is 1000000: 内部遍历用时:50msIterator遍历用时:120ms
可是我看到一篇贴子,认为" for(int i=0;i<l.size();i++) {obj = l.get(i); }"的遍历方式性能奇差无比,而主张使用"for(Iterator it = l.iterator();it.hasNext();) { obj = it.next(); }(这里,可能你写的更好些)".初学编程,不要见笑.
http://www-900.ibm.com/developerWorks/cn/java/j-forin.shtml
也许没有多大用处..
1.首先楼上的测试没有意义:
for(int i=0;i<list.size();i++){}
这个实际上就是 for(int i=0;i<100;i++){} 根本就没有遍历
遍历至少要读取所有的数据,而这个循环只占用小部分时间.
举个例子说明,两个运动员长跑,第一个运动可能热身只要1分钟,第二个运动员要10分钟.
而长跑完第一个运动员要4个小时,第二个运动员要5个小时,难道可以只比较热身的时间?2.对于ArrayList for(int i=0;i<list.size();i++)遍历比用Iterator确实要快,看过代码你就知道
Iterator中的next其实就是调用了get(i),但是效率不会差很多,基本上可以认为效率相当.
所以使用这两种方式都无可厚非,不过我喜欢用get(i)方法.
如果像ArrayList之类的的确没有必要使用Iterator
对于叠代时间完全花在next()上,是整整的遍历.一个遍历了,一个没有遍历,怎么比?奇怪楼上的测试结果你们竟然都不怀疑?
next()方法是get()+checkForComodification(),难道是因为调用了checkForComodification()(该方法是非常简单的咚咚,只是判断是否抛异常)?在list够大的时候,每次调用该方法肯定会浪费时间.我的理解是next()比get()方法在处理上至少多了一条寻址指令(当然寻址后还会处理该方法),积少成多,达到一定级别后,消耗的时间就会体现出来
the size of ArrayList is 1000000: 内部遍历用时:330msIterator遍历用时:170ms
get访问无论如何都会比Iterator快一点点,任何测试都是没有意义的.