如何解决Java哪个更有效,一个for-each循环或一个迭代器?
如果你只是在集合上徘徊以读取所有值,那么使用迭代器或新的for循环语法之间就没有区别,因为新语法仅在水下使用迭代器。
但是,如果你是指循环旧的“ c-style”
循环:
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
}
然后,取决于基础数据结构,新的for循环(或迭代器)可能会效率更高。这样做的原因是,对于某些数据结构,get(i)
是O(n)
运算,这使循环成为O(n 2)
运算。传统的链表就是这种数据结构的一个例子。作为基本要求,所有迭代器next()
都应为O(1)
操作,从而使循环为O(n)
。
要验证新的for
循环语法在水下使用迭代器,请比较以下两个Java代码段生成的字节码。首先是for循环:
List<Integer> a = new ArrayList<Integer>();
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<Integer> a = new ArrayList<Integer>();
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
解决方法
遍历集合的最有效方法是哪种?
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a) {
integer.toString();
}
要么
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();) {
Integer integer = (Integer) iterator.next();
integer.toString();
}
请注意,这不是this,this,this
或this
的精确重复,尽管对最后一个问题的答案之一接近。之所以不是这样,是因为其中大多数是在循环get(i)
内部进行比较的循环,而不是使用迭代器。
正如元建议,我将发布我对这个问题的答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。