【问题标题】:For-loop type comparisonFor循环类型比较
【发布时间】:2015-01-25 10:10:02
【问题描述】:

这两种for循环语法有什么区别,分别在什么时候使用:

for (String word : words) {

}

for (int i = 0; i < words.size(); i++) {

}

word 是一个字符串变量,words 是一个数组。

【问题讨论】:

    标签: java string for-loop syntax


    【解决方案1】:

    如果你需要索引变量“i”使用普通的for循环,否则使用foreach循环,即

    for (String word : words).
    

    【讨论】:

      【解决方案2】:

      前者被称为“增强型”循环,适用于数组以及任何实现 java.lang.Iterable 接口的类。所以不仅仅是收藏。 :^)

      后者通常在您需要知道迭代次数时使用。

      【讨论】:

        【解决方案3】:

        实际上有一个区别:你没有当前元素的索引。

        技术上存在更大的差异。 foreach 循环仅适用于 Iterable 对象。例如,在 Java 中,所有集合(List、Vector、Map、Set)和数组都是可迭代的。这些基本上是implement Iterable 的类。这个 for-each 循环:

        for (String word : words)
        {
        
        }
        

        被编译成这样的:

        for (Iterator<String> it = words.iterator(); it.hasNext(); )
        {
            String word = it.next();
        
        }
        

        Iterable 接口需要Iterator&lt;T&gt; iterator() 方法。

        另一个区别是,使用 for-each 方法时,底层迭代器会阻止您修改正在迭代的集合。为什么?因为,如果您在 foreach 循环中插入或删除一个元素,会发生什么?这是没有意义的,因此是被禁止的。如果您尝试这样做,您将收到ConcurrentModificationException。您可以使用经典循环来执行此操作,但在执行此操作时应小心。

        【讨论】:

          【解决方案4】:

          您编写的第一个是 foreach 循环。它是一个特殊的 for 循环,您可以方便地循环遍历数组或集合中的所有实例。这样你就不需要另一个变量来保存索引,但要使用它,你必须有一个数组或元素集合。

          第二个是基本的for循环,它为您提供了更多选择 - 您不仅可以使用它来循环遍历集合,还可以用于多次重复一个过程。所以你不需要数组或集合。

          您在示例中使用这些循环的方式,除了第一个示例更易于阅读之外没有其他区别。

          【讨论】:

            【解决方案5】:

            for-each 循环通过完全隐藏迭代器或索引变量来消除混乱和出错的机会。

            for (String word : words) {
            
            }
            

            上面的循环读作“for each word word in words。”

            使用传统的for-each 循环没有性能损失。

            【讨论】:

              【解决方案6】:

              可能取决于语言,但我认为没有区别。

              第一个示例的语法更简单,但没有计数器,因此您可能还应该声明另一个变量。在第二种情况下,您已经拥有它了..

              【讨论】:

                【解决方案7】:

                您编写的两个循环并不完全等效。这两个更接近:

                for (String word : words) {
                
                }
                
                for (int i = 0; i < words.size(); i++) {
                    String word = words[i];
                
                }
                

                注意 String 变量的声明和赋值。

                第一个循环,称为 foreach 循环,声明、分配和迭代,完全相同的语法可用于迭代集合(即 Iterable 对象)。

                唯一的缺点是您无法访问索引。如果您不需要它,请使用 foreach。

                【讨论】:

                  【解决方案8】:

                  我不知道您使用的是哪种语言,但我假设 Java 所以第一个循环被称为一个 for each loop 我通常在有迭代甚至列表时使用它

                  List<String> myList = new ArrayList<String>();
                  

                  但是这里的答案写得更好

                  这个循环可以很好地用于数组和其他的迭代 这样的收藏。尽管您可以在迭代中使用“for”循环 运算符,代码在使用 for-each 循环时变得更具可读性 处理庞大的数字。此循环优于“for”循环, 并非总是如此,但当出现以下情况时:

                  • 分配元素:当您需要为元素分配值时,避免使用 for-each 循环。只有访问时可以使用此循环 是需要的。
                  • 与单一结构一起使用:当您需要在某种情况下比较两个数组时,不能使用循环。
                  • 仅前向迭代:仅将“for-each”循环用于前向循环,并且在单步中也是如此。
                  • 兼容性:如果您需要您的代码与 Java 5 之前的版本兼容,您可能需要使用常规的 for 循环。

                  对于'for循环',它可以在特定任务需要重复次数时使用

                  例如,如果 words.size() 为 10,则循环将重复 9 次(因为没有相等的只有

                  for (int i = 0; i < words.size(); i++) {
                    System.out.println("My output");
                  }
                  

                  来源:https://www.udemy.com/blog/for-each-loop-java/ 这是之前问过的类似问题 When to use the for loop over the while loop?

                  【讨论】:

                    【解决方案9】:

                    第一个表示法为集合的每个元素创建一个指定类的对象。 第二种表示法对原始数组很有用。 但是,Java 8 引入了一种新的符号来遍历集合。

                    myIterable.forEach(element -> doSomething...);
                    

                    【讨论】:

                    • 新方法不仅仅是集合,而是所有的Iterables。 ;)
                    • 感谢@reegnz,集合以外的其他类实现了Iterable接口
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-03-25
                    • 2014-02-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多