在java中哪个循环最好迭代集合

时间:2016-05-06 17:57:10

标签: java loops collections

在决定使用以下哪个循环来迭代集合中的元素时,应该满足哪些条件。例如,在什么情况下,一个循环比另一个循环更有效?

  
      
  • For Loop ??
  •   
  • While Loop ??
  •   
  • For-Each Loop ??
  •   

4 个答案:

答案 0 :(得分:3)

Java中有3种类型的循环。他们做了不同的事情,关于Collection s,有不同的用法。

传统的For循环

传统的for循环看起来像:

for (int i = 0; i < list.length(); i++) {
    Object o = list.get(i);
}

当您需要将索引用于访问元素之外的其他内容时非常有用,例如当您有2个循环时,或者当您将索引影响到对象中的某个值时。

它只能用于列表,即使这样,也不应该与LinkedList一起使用,因为get(i)O(n)中是Collection。它不能与其他Set一起使用,例如length s。

也可以在数组上使用相同的语法(使用length()字段而不是size()方法),或使用字符串(使用charAti

通常不是最好的循环。它不会阻止您弄乱list变量或Collection的内容,这可能会导致令人惊讶的结果。

while循环

while循环可以用于很多事情,但是在Iterator的情况下,当你需要从列表中删除元素时使用它。它需要一个Iterator<String> iter = coll.iterator(); while (iter.hasNext()) { String elem = iter.next(); iter.remove(); } ,这需要更多的工作:

Collection

它允许您安全地删除集合的任何元素。它适用于任何ListSetCollection)。

它不会让您直接访问索引,但Iterablefor (String elem : coll) { } 对索引访问一无所知。

循环的快速枚举

最新添加的是上述的简短版本,无法删除项目:

Iterable

这是最清楚的。它不涉及任何额外的变量,适用于任何ConcurrentModificationException以及数组。

在循环(从循环内部或从另一个线程)循环时,禁止修改集合(它将抛出MyComponent.js),这样可以保证数据的一致性。

尽可能使用它。

答案 1 :(得分:2)

最好的方法是使用Iterator类进行迭代,但是你没有提到Collection

  1. 我会推荐Iterator循环。因为在foreachforwhile中需要定义外部计数器以获得循环条件的结束。 但在do-while中,不需要外部变量。

  2. for-each: - 它不会在IndexOutOfBoundException中引发但如果我们输入任何逻辑错误,那么其他可能会引发此异常(在数组的上下文中)。

  3. 但如果您需要使用for-each,则应使用indexfordo-while()

答案 2 :(得分:1)

首先在适当的时候使用for-each循环:迭代整个集合,只需要元素(而不是它们的索引)。

如果for-each不合适,那么根据你是否合理地需要for-loop的3个部分来选择for-versus-while,即。如果你只使用for循环的条件/中间部分,请使用while。

答案 3 :(得分:0)

如果这个集合是arraylist,这里有三个选择:

数组索引循环:

for (int i = 0; i < collection.length; i++) {
        type array_element = collection.get(index);

    }

Iterator hasNext()/ next():

for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
    type type = (type) iterator.next();

}
最简单:

for (iterable_type iterable_element : collection) {

}

当你需要元素的索引时,第一个是有用的。

当你不需要元素的索引但是在迭代时可能需要删除元素时,第二个是有用的。

第三个版本很简单,是所有人的首选。它很短,适用于您不需要任何索引或底层迭代器的所有情况。