java - 迭代链表的差异

标签 java

我知道使用迭代 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 LoopHow does the Java 'for each' loop work?获取一些附加信息。

关于java - 迭代链表的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15044540/

相关文章:

c# - Rijndael 使用 Java 加密,然后使用 C# 和 EnterpriseLibrary 4.1 解密

java - 应用程序意外停止。由 : Java. lang.NullPointerException 引起的错误

java - 朱尼特 2.0 : Different results for same test

javascript - 如何在 Java 中使用 HtmlUnit 获取由 javascript 创建的 Html,然后使用 Jsoup 解析它?

java - 使用 Ant 条件标记

java - 可以使用 iText 将 pdf 连接/合并在一起的函数 - 导致一些问题

java - 当需要多次设置和取消时,如何在 Java 中使用计时器?

java - 当登录尝试超过 3 次时,用户无法使用 Spring Security Rest API 登录?

java - 从最高到最低的顺序和位置从另一个 arraylist java 更改

java - HTTP Builder/Groovy - 获取源文本_和_ XmlSlurper 输出?