关于Java:使用for循环或while循环进行迭代?

关于Java:使用for循环或while循环进行迭代?

Iterate with for loop or while loop?

我经常看到这样的代码:

1
2
3
4
Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}

但我这样写(当Java 1.5不可用或无法使用Java 1.5时)为:

1
2
3
for(Iterator i = list.iterator(); i.hasNext(); ) {
    ...
}

因为

  • 更短
  • 它将i保留在较小的范围内
  • 它减少了混乱的机会。 (i是否在
    而? i在哪里声明?)

我认为代码应该尽可能地易于理解,这样我就只需编写复杂的代码即可完成复杂的事情。 你怎么看? 哪个更好?

来自:http://jamesjava.blogspot.com/2006/04/iterating.html


我更喜欢for循环,因为它还将迭代器的作用域设置为for循环。


while,for和foreach构造有适当的用途:

  • while-如果要迭代并且是否循环的决定因素仅基于条件,则使用此选项。在此循环结构中,保持索引仅是次要问题;一切都应根据条件

  • for-如果要循环并且主要关注的是数组/集合/列表的索引,请使用此选项。如果您最有可能以特定顺序遍历所有元素(例如,从排序列表后退),则使用for更为有用。

  • foreach-如果您只需要检查收藏而不管顺序如何,请使用此选项。

显然,上面有一些例外,但这是我决定使用其中的一般规则。话虽如此,我倾向于更频繁地使用foreach


为什么不使用for-each构造? (我已经有一段时间没有使用Java了,但是它存在于C#中,并且我很确定Java 1.5也有使用):

1
2
3
4
5
6
7
List<String> names = new ArrayList<String>();
names.add("a");
names.add("b");
names.add("c");

for (String name : names)
    System.out.println(name.charAt(0));

正如您所指出的,我认为范围是这里最大的问题。

在" while"示例中,迭代器在循环外部声明,因此在循环完成后它将继续存在。如果在以后的某个时间再次使用相同的迭代器,则可能会导致问题。例如您可能忘记在另一个循环中使用它之前对其进行初始化。

在" for"示例中,迭代器在循环内部声明,因此其范围仅限于循环。如果您尝试在循环后使用它,则会出现编译器错误。


恕我直言,如果您从英语角度看这段代码,则在这种情况下,for循环的可读性较差。我正在编写一个代码,其中的作者确实滥用了循环,而且效果不佳。比较以下内容:

1
2
for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;

1
2
3
4
5
while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}

如果只使用一次迭代器并将其丢弃,则首选第二种形式;否则,您必须使用第一种形式


使用for循环,您可以使用单个变量,因为它为当前仅用于for循环的变量设置了范围。但是,这在while循环中是不可能的。
例如:
我for(i = 0; in1; i ++)做某事..

for(i = 0; i n2; i + = 2)做点什么。

因此,在第一个循环之后,i = n1-1最后。但是在使用第二个循环时,您可以将i再次设置为0。
然而

int i = 0;

while(我小于限制){做某事..; i ++; }

因此,最后我将设置为limit-1。因此,您不能在另一个while循环中使用相同的i。


并非在这种情况下可能很重要,但是编译器,VM和CPU通常使用他们在幕后使用的特殊优化技术,这些技术可使循环性能更好(并在不久的将来并行化),通常它们不会这样做。 while循环(因为很难确定其实际运行方式)。但是在大多数情况下,代码清晰度应该胜过优化。


我同意迭代时" for"循环更清晰,更合适。

" while"循环适用于轮询,或者满足退出条件的循环数将根据循环内的活动而变化。


学术界倾向于使用while循环,因为它可以简化程序的推理。我倾向于使用for或foreach循环结构,因为它们使代码更易于阅读。


两者都很好,但请记住,有时直接访问Iterator很有用(例如,如果要删除符合特定条件的元素-如果在for(T o内执行collection.remove(o),则会得到ConcurrentModificationException:集合)循环)。

我更喜欢在几乎所有时间都编写for(blah:blah)[foreach]语法,因为它对我来说似乎更自然易读。一般来说,迭代器的概念在编程之外并没有真正的相似之处


我是为了清晰起见的for循环。当我遇到一些不确定的条件时使用while循环。


我同意应尽可能使用for循环,但有时会在循环体内控制更复杂的逻辑,以控制迭代器。在这种情况下,您必须花点时间。


尽管两者都很好,但我倾向于使用第一个示例,因为它更易于阅读。

使用while()循环在每一行上进行的操作较少,这使代码新手可以更轻松地了解所发生的情况。

这种类型的构造还使我可以将初始化分组在一个公共位置(在方法的顶部),这也简化了我的注释,并为第一次阅读它的人提供了概念化。


都可以。我自己用于(),并且我不知道是否存在编译问题。我怀疑它们都已经优化到几乎相同的东西。


推荐阅读

    程式编辑快捷键|代码编辑快捷键

    程式编辑快捷键|代码编辑快捷键,,1. 代码编辑快捷键Option Explicit ‘强制对模块内所有变量进行声明(2) Option Base 1 ‘指定数组的第一

    vivo网络设置代码|vivo功能代码

    vivo网络设置代码|vivo功能代码,,1. vivo功能代码代码是*#558#1.首先在手机桌面里找到电话。2.在拨号键盘里输入*#558#3.这时候就进入了手

    确定java按钮响应事件的代码

    确定java按钮响应事件的代码,,* 阅读本文可以结合最后在java登录窗口界面下面是一个链接。 是定义的容器。 容器(CP =得到内容面板); / /

    雷蛇设置宏|雷蛇设置宏循环

    雷蛇设置宏|雷蛇设置宏循环,,雷蛇设置宏循环使用雷蛇软件设置宏驱动的方法如下:1、今天小编就以雷蛇鼠标为例,介绍宏定义的使用。当刚买的鼠

    excel窗口快捷键|excel代码窗口快捷键

    excel窗口快捷键|excel代码窗口快捷键,,excel代码窗口快捷键首先是新建并打开Excel表格,萊垍頭條按快捷键“Ctrl”+“F10”,可把窗口切换,再

    乐视股票代码

    乐视股票代码,股票,股票代码,乐视股票代码股票代码其实很容易理解,每一串代码代表的就是一只股票,用“平安银行”来举例说明吧,它的代码就是0

    asp中文图片验证码的实现代码

    asp中文图片验证码的实现代码,,这个代码是在别人的增加对汉字的基础功能,谢谢你,谢谢轻烟。 以前的图片验证代码很容易破解,所以在目前的基础