【问题标题】:Use a for-loop or a for-each loop? [closed]使用 for 循环还是 for-each 循环? [关闭]
【发布时间】:2013-08-07 08:26:53
【问题描述】:

我们应该更喜欢 for-each 循环而不是传统的 for-循环吗? while循环有优势吗?

List<String> names = Arrays.asList("John", "Jeff", "Mary", "Elise");

//for-each loop
for(String name: names){
    log(name);
}

//traditional for-loop
for(int index=0; index < 10; ++index){
    log(names.get(index));
}

//Iterator while
Iterator<String> iter1 = names.iterator();
while (iter1.hasNext()) {
    log(iter1.next());
}

//Iterator for loop
for(Iterator<String> iter2 = names.iterator(); iter2.hasNext();){
    log(iter2.next());
}

什么味道最好用?

【问题讨论】:

  • 随心所欲。但希望您希望最大限度地提高可读性。当我不需要索引时,我使用for each
  • 适合工作的正确工具.. 没有味道。
  • 传统循环可能会加载错误,尤其是当索引从 1 开始,而数组从零开始时。

标签: java loops for-loop while-loop each


【解决方案1】:

都是一样的。但是有些情况比其他情况更有利

案例 1:

//for-each loop
for(String name: names){
    log(name);
}

好评:

  • 当你想迭代集合时
  • 不能对数组进行添加或删除。
  • 不需要您迭代的项目索引

案例 2:

//traditional for-loop
for(int index=0; index < 10; ++index){
    log(names.get(index));
}

好评:

  • 当你想迭代集合时
  • 您需要处理您迭代的项目的索引。因此,您始终拥有当前所在索引的价值。

案例 3:

Iterator<String> iter1 = names.iterator();
while (iter1.hasNext()) {
    log(iter1.next());
}

//Iterator for loop
for(Iterator<String> iter2 = names.iterator(); iter2.hasNext();){
    log(iter2.next());
}

好评:

  • 当你想迭代集合时
  • 添加或删除需要||在迭代时进行。

【讨论】:

  • 我想他已经知道了,他只是想知道哪个更好,而我认为不可能说哪个更好:)
  • @Azad 是的,很难说哪个更好。但是从帖子中我没有找到任何可以表明他是否会知道这些事实的信息。
  • 应该避免循环 2,因为这更容易导致错误。通常以您的 index = 1 开头; list.get(index) 以及在循环内使用 index++ 时。
【解决方案2】:

循环 1、3 和 4 本质上是相同的,并且可能编译为相同的字节码。所以使用第一个更具可读性。

如果您不知道要处理的列表实现,则应避免使用循环 2。特别是,list.get(i) 在某些列表(例如 LinkedLists)上可能是 O(n) 操作,使得循环 2 的性能为 O(n^2) 操作 = 不好。

【讨论】:

    【解决方案3】:

    选项 1 只是 3 和 4 的缩短版本。其中 #1 是首选,因为它更易于编写和阅读。选项 2 在微性能方面可能会更好,因为它不会创建 Iterator 对象,但仅在您使用 RandomAccess 列表(如 ArrayList)的情况下

    【讨论】:

      【解决方案4】:

      当您想删除此循环中的某些元素时,请勿使用foreach 循环。而是使用经典的for 循环,当您可以在从集合中删除元素后减少迭代器。

      【讨论】:

        【解决方案5】:

        For 和 foreach 在性能上略有不同。它们的速度大致相同。但是 foreach 循环为局部变量使用了更多的堆栈空间。

        更多细节请参考

        http://forums.asp.net/t/1209455.aspx/1
        

        【讨论】:

          【解决方案6】:

          只要容器实现了Iterable,就用for each,只要上面提到你不需要索引。 Altought 可能您将使用 Objects id 字段而不是 for id。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-12
            • 1970-01-01
            • 1970-01-01
            • 2020-09-03
            • 1970-01-01
            • 2022-06-10
            • 2014-03-15
            相关资源
            最近更新 更多