减少循环的最佳习语

时间:2009-12-01 23:16:19

标签: java

减少循环的最佳/首选习惯是什么?为什么?

for(int idx=(len-1); idx>=0; idx--) {...}

for(int idx=(len-1); idx>-1; idx--) {...}

或(基于sylvarking的答案,但用于约束索引范围)

for(int idx=len; idx-->0; ) {...}

是否有一个或另一个更有可能绊倒另一个开发者?

9 个答案:

答案 0 :(得分:11)

您可能会看到另一个面向数组的变体:

int n = foo.length;
while (n-- > 0) {
  /* Do something with foo[n] */
}

在你展示的选项中,我更喜欢第一个。

  • 0(可以说)比-1更具可读性。
  • 与零比较通常比与其他常数相比更快。它是一条指令,用于检查堆栈中的单个值。其他比较使用一条指令将常量压入堆栈,另一条指令用于比较前两个值。

答案 1 :(得分:11)

我推荐以下内容,因为在字节代码级别优化了与零的比较。

for(int idx=(len-1); idx>=0; idx--) {...}

这是Jack Shirazi {/ 3}提出的建议

答案 2 :(得分:1)

我不能说我见过后者,所以这是第一次投票。

应该没有性能差异。

注意你的循环遍历max + 1个元素。通常我认为我期望从max-1迭代到0。

答案 3 :(得分:1)

有趣的问题!就个人而言,我使用第一个,这是我看到其他程序员最常用的。我认为原因是人们习惯于测试零,-1可能会抛出一些。

答案 4 :(得分:0)

第一个;这是标准方式。

答案 5 :(得分:0)

第二个仍然让我感到困惑 第一个是(或多或少)一个人期待的东西,在递减循环中,人们不必检查> -1而不是等于。

就个人而言,我会像Mark Byers写的那样完成。

答案 6 :(得分:0)

我的投票是:

  

for(int idx =(len-1); idx> = 0; idx - )

顺便说一句,我赞成for循环中的前缀增量/减量运算符(--idx),因为它会避免使用不必要的idx副本(尽管许多编译器可能会认识到这一点并为你修复它)。

答案 7 :(得分:-1)

我发现带有计数器的for循环应该从零开始到达某个限制。

for(int i = 0; i < MAX; i++) {
....
}

这是非常成熟的,你可以期待任何看到这个的人立刻明白发生了什么。这也意味着来自该形式的任何偏差,通过向后计数或从一开始计数或从三步开始,都会使其难以理解,因为您需要识别它是不同的,解析它并理解它。这包括您的所有示例。

我建议写清楚:

for(int i = 0; i < MAX; i++) {
  indexFromEnd = (MAX - 1) - i;
....
 }

答案 8 :(得分:-2)

如果您有一个列表,请使用ListIterator:

以下基于http://www.java-samples.com/showtutorial.php?tutorialid=235

的示例
class ListIter {
    public static void main(String args[]) {
        // create an array list
        ArrayList al = new ArrayList();
        // add elements to the array list
        al.add("A");
        al.add("B");
        al.add("C");
        al.add("D");
        al.add("E");
        al.add("F");
        // use ListIterator to display contents of al backwards
        ListIterator litr = al.listIterator(al.size());
        while (litr.hasPrevious()) {

            Object element = litr.previous();
            System.out.print(element + " ");

        }
        System.out.println();
    }
}