在决定使用以下哪个循环来迭代集合中的元素时,应该满足哪些条件。例如,在什么情况下,一个循环比另一个循环更有效?
- For Loop ??
- While Loop ??
- For-Each Loop ??
答案 0 :(得分:3)
Java中有3种类型的循环。他们做了不同的事情,关于Collection
s,有不同的用法。
传统的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()
方法),或使用字符串(使用charAt
和i
)
通常不是最好的循环。它不会阻止您弄乱list
变量或Collection
的内容,这可能会导致令人惊讶的结果。
while循环可以用于很多事情,但是在Iterator
的情况下,当你需要从列表中删除元素时使用它。它需要一个Iterator<String> iter = coll.iterator();
while (iter.hasNext()) {
String elem = iter.next();
iter.remove();
}
,这需要更多的工作:
Collection
它允许您安全地删除集合的任何元素。它适用于任何List
(Set
或Collection
)。
它不会让您直接访问索引,但Iterable
和for (String elem : coll) {
}
对索引访问一无所知。
最新添加的是上述的简短版本,无法删除项目:
Iterable
这是最清楚的。它不涉及任何额外的变量,适用于任何ConcurrentModificationException
以及数组。
在循环(从循环内部或从另一个线程)循环时,禁止修改集合(它将抛出MyComponent.js
),这样可以保证数据的一致性。
尽可能使用它。
答案 1 :(得分:2)
最好的方法是使用Iterator
类进行迭代,但是你没有提到Collection
我会推荐Iterator
循环。因为在foreach
或for
或while
中需要定义外部计数器以获得循环条件的结束。
但在do-while
中,不需要外部变量。
for-each
: - 它不会在IndexOutOfBoundException
中引发但如果我们输入任何逻辑错误,那么其他可能会引发此异常(在数组的上下文中)。
但如果您需要使用for-each
,则应使用index
或for
或do-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) {
}
当你需要元素的索引时,第一个是有用的。
当你不需要元素的索引但是在迭代时可能需要删除元素时,第二个是有用的。
第三个版本很简单,是所有人的首选。它很短,适用于您不需要任何索引或底层迭代器的所有情况。