关于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()循环在每一行上进行的操作较少,这使代码新手可以更轻松地了解所发生的情况。

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


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


推荐阅读

    linux命令基础代码?

    linux命令基础代码?,基础,系统,管理,工作,代码,网络,单位,信息,数据,命令,lin

    linux命令循环导入?

    linux命令循环导入?,服务,系统,密码,数据,增长,名字,数字,官网,地址,文件,mys

    linux打开代码命令行?

    linux打开代码命令行?,系统,首页,工具,终端,代码,密码,情况,命令,快捷键,窗

    linux编辑循环命令?

    linux编辑循环命令?,代码,增长,工具,基础,灵活,状态,连续,系统,数字,数据,lin

    linux克隆代码命令?

    linux克隆代码命令?,系统,代码,文件,命令,目录,源文件,文件夹,路径,目标,表

    linux命令行调试代码?

    linux命令行调试代码?,环境,代码,信息,平台,程序,编辑,版本,步骤,体系结构,

    linux编译源代码命令?

    linux编译源代码命令?,工具,代码,百度,最新,环境,项目,系统,电脑,密码,内核,l

    linux命令提交代码?

    linux命令提交代码?,工作,系统,地址,代码,命令,数据,信息,目录,标准,发行,求

    linux循环命令大全?

    linux循环命令大全?,工作,地址,系统,命令,工具,代码,目录,连续,环境,管理,Lin

    循环执行linux命令?

    循环执行linux命令?,工具,系统,名称,代码,第一,环境,位置,数字,脚本,变量,Lin

    linux代码同步命令?

    linux代码同步命令?,时间,服务,系统,地址,代码,网络,通信,图片,风险,管理,lin

    linux命令错误代码?

    linux命令错误代码?,系统,密码,电脑,网络,手机,网址,软件,代码,设备,老板,Lin

    linux同步代码命令?

    linux同步代码命令?,时间,系统,通信,网络,标准,图片,服务,代码,线程,单位,Lin

    linux拉取代码命令?

    linux拉取代码命令?,代码,工作,地址,命令,数据,系统,单位,生产,软件,目录,lin

    linux程序命令不可用?

    linux程序命令不可用?,系统,网络,地址,命令,情况,名称,信息,服务,密码,程序,l

    linux循环复制命令?

    linux循环复制命令?,系统,文件,命令,目录,地址,源文件,文件夹,目标,文件名,

    linux代码对齐命令?

    linux代码对齐命令?,系统,地址,标准,信息,对比,名称,代码,命令,文件,工作,lin

    linux命令运行代码?

    linux命令运行代码?,代码,单位,系统,环境,连续,保险,工具,命令,文件,音乐,Lin

    搭建linux命令行代码?

    搭建linux命令行代码?,系统,软件,工作,名字,服务,代码,地址,环境,管理,密码,l

    linux的命令不可用?

    linux的命令不可用?,系统,工具,基础,在线,异常,命令,用户,路径,文件,变量,lin