java中for循环和迭代器哪个效率高?

Python017

java中for循环和迭代器哪个效率高?,第1张

java中迭代器效率

ArrayList实现了RandomAccess接口,RandomAccess接口为ArrayList带来了什么好处呢?

我们查看一下RandomAccess的源码文档,发现有这样一段描述:

As a rule of thumb, a List implementation should implement this interface if, for typical instances of the class, this loop:

for (int i=0, n=list.size()i <ni++)

list.get(i)

runs faster than this loop:

for (Iterator i=list.iterator()i.hasNext())

i.next()

从描述中,可以看出实现RandomAccess接口的集合类,使用for循环的效率会比Iterator高。

RandomAccess接口为ArrayList带来的好处:

1、可以快速随机访问集合。

2、使用快速随机访问(for循环)效率可以高于Iterator。

Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较。虽然网上已经有了类似的文章,但是对他们的结论并不认同。常见的实现方法:1.for循环:for(int i = 0i <list.size()i++) for(int i = 0, size = list.size()i <sizei++) 一般人都会认为第二种写法效率高。2.foreach:for(Object obj : list) 这是一种简洁的写法,只能对列表进行读取,无法修改。3.while:int size = list.size()while(size-- >0) 4.迭代:Object iter = list.iterator()while(iter.hasNext()) { iter.next()}测试代码: 针对以上几种方法编写的测试代码。 public static void main(String[] args) { List<Integer>list = new ArrayList<Integer>()int runTime = 1000//执行次数 for (int i = 0i <1000 * 1000i++) { list.add(i)} int size = list.size()long currTime = System.currentTimeMillis()//开始分析前的系统时间 //基本的for for(int j = 0j <runTimej++) { for (int i = 0i <sizei++) { list.get(i)} } long time1 = System.currentTimeMillis()//foreach for(int j = 0j <runTimej++) { for (Integer integer : list) { } } long time2 = System.currentTimeMillis()for(int j = 0j <runTimej++) { //while int i = 0 while(i <size){ list.get(i++)} } long time3 = System.currentTimeMillis()for(int j = 0j <runTimej++) {//普通for循环 for (int i = 0i <list.size()i++) { list.get(i)} } long time4 = System.currentTimeMillis()for(int j = 0j <runTimej++) {//迭代 Iterator<Integer>iter = list.iterator()while(iter.hasNext()) { iter.next()} } long time5 = System.currentTimeMillis()long time = time1 - currTime System.out.print("use for:" + time)time = time2 - time1System.out.print("\tuse foreach:" + time)time = time3 - time2System.out.print("\tuse while:" + time)time = time4 - time3System.out.print("\tuse for2:" + time)time = time5 - time4System.out.print("\tuse iterator:" + time)System.out.println()}输出结果(JDK1.6):1.use for:8695 use foreach:17091 use while:6867 use for2:7741 use iterator:141442.use for:8432 use foreach:18126 use while:6905 use for2:7893 use iterator:139763.use for:8584 use foreach:17177 use while:6875 use for2:7707 use iterator:14345结论:1.针对列表的 foreach的效率是最低:耗时是普通for循环的2倍以上。个人理解它的实现应该和iterator相似。2. list.size()的开销很小:list.size()次数多少对效率基本没有影响。查看ArrayList的实现就会发现,size()方法的只是返回了对象内的长度属性,并没有其它计算,所以只存在函数调用的开销。对数组的测试:将代码中的列表list换做数组再进行测试(iterator不适用),发现耗时基本为0。说明:3. 列表的get()方法开销不少应该主要是检测数据合法性时产生的。将执行次数增加100万倍,这时可以看出结果基本相等,并没有明显的差异。说明:4. 数组length也没有开销可见数组长度并不是每次执行的时候都要计算的。联想一下Java创建数组的时候要求必须指定数组的长度,编译处理的时候显然没有把这个值抛弃掉。网上有一篇类似的文章,它居然得出了一个foreach执行效率最高的结论。