当前位置: 首页 > >

java 迭代器 for循环_Java哪个更有效,一个for-each循环或一个迭代器?

发布时间:

小编典典


如果你只是在集合上徘徊以读取所有值,那么使用迭代器或新的for循环语法之间就没有区别,因为新语法仅在水下使用迭代器。


但是,如果你是指循环旧的“ c-style”循环:


for(int i=0; i


Object o = list.get(i);


}


然后,取决于基础数据结构,新的for循环(或迭代器)可能会效率更高。这样做的原因是,对于某些数据结构,get(i)是O(n)运算,这使循环成为O(n 2)运算。传统的链表就是这种数据结构的一个例子。作为基本要求,所有迭代器next()都应为O(1)操作,从而使循环为O(n)。


要验证新的for循环语法在水下使用迭代器,请比较以下两个Java代码段生成的字节码。首先是for循环:


List a = new ArrayList();


for (Integer integer : a)


{


integer.toString();


}


// Byte code


ALOAD 1


INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;


ASTORE 3


GOTO L2


L3


ALOAD 3


INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;


CHECKCAST java/lang/Integer


ASTORE 2


ALOAD 2


INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;


POP


L2


ALOAD 3


INVOKEINTERFACE java/util/Iterator.hasNext()Z


IFNE L3


其次,迭代器:


List a = new ArrayList();


for (Iterator iterator = a.iterator(); iterator.hasNext();)


{


Integer integer = (Integer) iterator.next();


integer.toString();


}


// Bytecode:


ALOAD 1


INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;


ASTORE 2


GOTO L7


L8


ALOAD 2


INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;


CHECKCAST java/lang/Integer


ASTORE 3


ALOAD 3


INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;


POP


L7


ALOAD 2


INVOKEINTERFACE java/util/Iterator.hasNext()Z


IFNE L8


2020-03-05



友情链接: