我知道使用迭代 LinkedList
for(int i = 0; i < list.size(); i++){
Item item = list.get(i);
}
获取单个对象的性能很差,因为每次调用 .get(i) 都会从列表的开头迭代到 i。
正确的方法是使用迭代器。到目前为止,一切都很好。
但是这种风格怎么样:
for(Item item : list){
// item is already here
}
这与使用迭代器具有相同的性能吗?这在内部是如何运作的?
最佳答案
Does this have the same performance like using Iterators?
是。两种变体都会生成相同的字节码。以下字节代码是从 for-each-循环生成的,但是当在循环中使用迭代器时,它看起来完全相同:
for(Object o : list) {
}
44: aload_1
45: invokevirtual #30 // Method java/util/LinkedList.iterator:()Ljava/util/Iterator;
48: astore_3
49: goto 59
52: aload_3
53: invokeinterface #34, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
58: astore_2
59: aload_3
60: invokeinterface #40, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
65: ifne 52
How does this work internally?
对于非数组,for-each-循环在内部使用迭代器。请参阅上面的字节代码 - 所有方法都会被调用,这些方法在使用迭代器时也会被调用。
另请参阅The For-Each Loop和 How does the Java 'for each' loop work?获取一些附加信息。
关于java - 迭代链表的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15044540/