Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用for循环还是while循环进行迭代?_Java_For Loop_Iterator - Fatal编程技术网

Java 使用for循环还是while循环进行迭代?

Java 使用for循环还是while循环进行迭代?,java,for-loop,iterator,Java,For Loop,Iterator,我经常看到这样的代码: Iterator i = list.iterator(); while(i.hasNext()) { ... } 但我将其写为(当Java 1.5不可用或无法使用时): 因为 它比较短 它将i保持在较小的范围内 它减少了混乱的机会。(是否在外部使用i while?在哪里声明了i) 我认为代码应该尽可能简单易懂,这样我只需要编写复杂的代码来完成复杂的事情。你怎么认为?哪个更好 发件人:两者都可以。我自己使用for(),不知道是否存在编译问题。我怀疑它们都得到了

我经常看到这样的代码:

Iterator i = list.iterator();
while(i.hasNext()) {
    ...
}
但我将其写为(当Java 1.5不可用或无法使用时):

因为

  • 它比较短
  • 它将
    i
    保持在较小的范围内
  • 它减少了混乱的机会。(是否在外部使用
    i
    while?在哪里声明了
    i
我认为代码应该尽可能简单易懂,这样我只需要编写复杂的代码来完成复杂的事情。你怎么认为?哪个更好


发件人:

两者都可以。我自己使用for(),不知道是否存在编译问题。我怀疑它们都得到了几乎相同的优化。

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

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

为什么不为每个构造使用?(我已经有一段时间没有使用Java了,但C#中也存在这种情况,我很确定Java1.5也有这种情况):

List name=new ArrayList();
名称。添加(“a”);
名称。添加(“b”);
名称。添加(“c”);
for(字符串名称:名称)
System.out.println(name.charAt(0));
我同意“for”循环在迭代时更清晰、更合适


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

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

在“while”示例中,迭代器在循环外部声明,因此在循环完成后它将继续存在。如果稍后再次使用同一迭代器,这可能会导致问题。例如。在另一个循环中使用它之前,您可能会忘记初始化它


在“for”示例中,迭代器是在循环中声明的,因此其作用域仅限于循环。如果在循环后尝试使用它,将出现编译器错误。

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

使用while()循环,每行上发生的操作更少,使代码新手更容易理解发生了什么


这种类型的构造还允许我将初始化分组到一个公共位置(在方法的顶部),这也简化了我的注释,我同意应该尽可能地使用for循环,但有时在循环体中有更复杂的逻辑控制迭代器。在这种情况下,您必须使用while。

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

  • while
    -如果您正在迭代,并且循环与否的决定因素仅基于一个条件,请使用此选项。在这个循环构造中,保持索引只是次要考虑的问题;一切都应以条件为基础

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

  • foreach
    -如果您只需要浏览您的收藏,而不考虑顺序,请使用此选项


显然,上述情况也有例外,但这是我在决定使用哪种方法时使用的一般规则。尽管如此,我倾向于更频繁地使用
foreach

为了清晰起见,我是for循环。当我遇到一些不确定的情况时,我会使用While循环。

在这种情况下,这可能并不重要,但编译器、虚拟机和CPU通常都有他们在后台使用的特殊优化技术,这将使循环性能更好(并且在不久的将来是并行的),一般来说,它们不会在while循环中这样做(因为很难确定它实际上是如何运行的)。但在大多数情况下,代码的清晰性应该胜过优化。

两者都很好,但请记住,有时直接访问迭代器是很有用的(例如,如果您要删除符合特定条件的元素,那么如果您在for(to:collection)循环中执行collection.remove(o),您将得到ConcurrentModificationException


我几乎总是喜欢编写for(blah:blah)[foreach]语法,因为它对我来说更自然易读。迭代器的概念通常在编程之外没有真正的相似之处,学术界倾向于使用while循环,因为它有助于对程序进行不太复杂的推理。我倾向于使用for或foreach循环结构,因为它们使代码更易于阅读。

IMHO,如果从英语的角度来看此代码,for循环在这种情况下可读性较差。我正在编写一个代码,在这个代码中,作者滥用进行循环,但这并不漂亮。比较以下各项:

for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;
(;(currUserObjectIndex<\u domainObjectReferences.Length)和(\u domainObjectReferences[currUserObjectIndex].VisualIndex==index);+currUserObjectIndex) ++currenumuserobjects; vs

while(currUserObjectIndex<\u domainObjectReferences.Length&&u domainObjectReferences[currUserObjectIndex].VisualIndex==index)
{
++currenumuserobjects;
++currUserObjectIndex;
}

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

对于(i=0;i n2;i+=2)做某事

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

int i=0

而(i小于限制){do s
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));
for (; (currUserObjectIndex < _domainObjectReferences.Length) && (_domainObjectReferences[currUserObjectIndex].VisualIndex == index); ++currUserObjectIndex)
    ++currNumUserObjects;
while (currUserObjectIndex < _domainObjectReferences.Length && _domainObjectReferences[currUserObjectIndex].VisualIndex == index)
{
    ++currNumUserObjects;
    ++currUserObjectIndex;
}