迭代for循环还是while循环?
我经常看到这样的代码:
Iterator i = list.iterator(); while(i.hasNext()) { ... }
但我这样写(当Java 1.5不可用或者无法使用Java 1.5时)为:
for(Iterator i = list.iterator(); i.hasNext(); ) { ... }
因为
- 更短
- 它使
i
的范围更小 - 它减少了混乱的机会。 (在一段时间以外使用" i"?在哪里声明" i"?)
我认为代码应该尽可能地易于理解,因此我只需要编写复杂的代码即可完成复杂的事情。你怎么认为?哪个更好?
来自:http://jamesjava.blogspot.com/2006/04/iterating.html
解决方案
都可以。我自己用于(),并且我不知道是否存在编译问题。我怀疑他们都在几乎相同的方面进行了优化。
我更喜欢for循环,因为它还将迭代器的作用域设置为for循环。
如果只使用一次迭代器并将其丢弃,则首选第二种形式;否则,我们必须使用第一种形式
为什么不使用for-each构造? (我已经有一段时间没有使用Java了,但这在Cand中存在,我很确定Java 1.5也有):
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"循环更清晰,更合适。
" while"循环适用于轮询,或者满足退出条件的循环数将根据循环内的活动而变化。
正如我们所指出的,我认为范围是这里最大的问题。
在" while"示例中,迭代器在循环外部声明,因此在循环完成后它将继续存在。如果稍后再使用此相同的迭代器,则可能会导致问题。例如我们可能会忘记在另一个循环中使用它之前对其进行初始化。
在" for"示例中,迭代器在循环内部声明,因此其范围仅限于循环。如果我们尝试在循环后使用它,则会出现编译器错误。
尽管两者都很好,但我倾向于使用第一个示例,因为它更易于阅读。
使用while()循环在每一行上进行的操作更少,这使代码新手可以更轻松地了解所发生的事情。
这种类型的构造还使我可以将初始化分组在一个公共位置(在该方法的顶部),这也简化了我的注释,并为首次阅读它的人提供了概念化。
我同意应尽可能使用for循环,但有时会有更复杂的逻辑来控制循环体内的迭代器。在这种情况下,我们必须花点时间。
while,for和foreach构造有适当的用途:
while
-如果我们要迭代并且是否循环的决定因素仅基于条件,则使用它。在此循环结构中,保持索引仅是次要问题;一切都应根据条件for
-如果我们正在循环并且主要关注的是数组/集合/列表的索引,请使用它。如果我们最有可能以特定顺序遍历所有元素(例如,从排序列表后退),则使用for更有用。foreach
-如果我们只需要检查收藏而不管顺序如何,请使用此选项。
显然,上述情况有例外,但这是我决定使用其中的一般规则。话虽如此,我倾向于更频繁地使用" foreach"。
我是为了清晰起见的for循环。当我遇到一些不确定性条件时使用while循环。
并非在这种情况下可能很重要,但是编译器,VM和CPU通常使用他们在幕后使用的特殊优化技术,这些技术可使循环性能更好(并在不久的将来并行化),通常它们不会这样做。 while循环(因为更难确定其实际运行方式)。但是在大多数情况下,代码清晰度应该胜过优化。
两者都很好,但是请记住,有时直接访问Iterator很有用(例如,如果要删除符合特定条件的元素,则在for(T o:collection)内执行collection.remove(o)时,将获得ConcurrentModificationException ) 环形)。
我更喜欢几乎一直都在编写for(blah:blah)[foreach]语法,因为它对我来说似乎更自然易读。一般而言,迭代器的概念在编程之外并没有真正的相似之处
学术界倾向于使用while循环,因为它可以简化程序的推理。我倾向于使用foror foreach循环结构,因为它们使代码更易于阅读。