概述
如果您只是在集合中徘徊以读取所有的值,那么使用迭代器和新的for循环语法没有什么区别,因为新的语法只是在水下使用迭代器。
但是,如果您指的是旧的“c样式”循环: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
正如您所看到的,生成的字节代码实际上是相同的,因此使用这两种格式都不会造成性能损失。因此,您应该选择对您最有吸引力的循环的形式,对于大多数人来说,这将是for-每一个循环,因为它有较少的样板代码。
最后
以上就是纯情星星为你收集整理的java迭代器和for循环区别_哪一个更有效,一个for-每个循环,还是一个迭代器?...的全部内容,希望文章能够帮你解决java迭代器和for循环区别_哪一个更有效,一个for-每个循环,还是一个迭代器?...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复