是否优先使用传统的for循环,for-each循环或迭代器来遍历List?
1) for(MyClass mc : al){ // do something on mc }
or
2) iter = arrayList.iterator();
while(iter.hasNext()){MyClass mc = iter.Next()}
答案 0 :(得分:4)
您可以使用迭代器来避免ConcurrentModificationExceptions。
iter = arrayList.iterator();
while(iter.hasNext()) {
MyClass mc = iter.next();
if(shouldItBeRemoved(mc)) {
iter.remove(); // Will not throw ConcurrentModificationException
// arrayList.remove(mc); // Will throw CME
}
}
也就是说,我发现for-each循环更具可读性,所以每当你不修改循环中的列表时都要使用它。
答案 1 :(得分:4)
对于大多数迭代,您应该使用常规循环:
for (Object o : list) { /* */ }
它更具可读性,意图清晰,潜在的错误保持在最低限度。
当您需要显式控制迭代时使用迭代器,例如,当您可能想要重新开始迭代时。
答案 2 :(得分:2)
我的偏好是
1)如果我需要向前推进列表而不对List对象进行任何修改,那么对于可读和干净的代码,我将使用:
for(MyClass mc : list){
/* code without modification to list */
}
2)如果我需要修改List对象,毫无疑问我将使用:
iter = list.iterator();
while(iter.hasNext()) {
MyClass mc = iter.next()
/* code without modification to list */
/* code with modification to list */
}
其他信息:
如果您需要创建一个可以遍历多种类型集合的实用程序方法(例如ArrayList,LinkedList,HashSet,TreeSet,LinkedHashSet),Iterator将非常有用
public class Example {
public static void iterateAndDoSomething(Iterator<MyClass> iter) {
while(iter.hasNext()) {
MyClass mc = iter.next();
/* code without modification to list */
/* code with modification to list */
}
}
public static void main(String[] args) {
ArrayList<MyClass> als = new ArrayList<MyClass>();
TreeSet<MyClass> tss = new TreeSet<MyClass>();
iterateAndDoSomething(als.iterator());
iterateAndDoSomething(tss.iterator());
}
}
答案 3 :(得分:1)
某些类没有iterator()
方法(例如NodeList
),那么您必须使用#1。除此之外,我认为这是一个偏好的问题。
答案 4 :(得分:1)
如果我在循环期间需要索引,则使用for (i=0;
,如果它是唯一可能的事情,则使用iterator()
,或者我需要remove()
个元素(并发)。对于所有其他情况,我使用缩短的for循环for(MyClass mc : al)
,因为它具有可读性。
答案 5 :(得分:1)
传统循环(基于索引)在需要索引来操作数组时非常有用。
如果你不关心索引,你感兴趣的只是从数组中获取值,for..each循环是最合适的。
某些Collection对象没有提供使用index获取值的方法,在这种情况下,iterator()是唯一的选项。
答案 6 :(得分:0)
根据您提供的代码片段,很明显,for-each迭代会产生更清晰的代码。
如果存在两者,您可以灵活选择想要的内容。
答案 7 :(得分:0)
Java 1.4上没有for-each-loop,所以如果你需要支持Java&lt; 1.5,这可能会被淘汰。
另外两个选择是我认为的用例和风格问题。迭代器通常看起来更干净,但您可能还需要一个计数器变量,因此for循环可能更适合您的需求。另外,一些列表实现不提供迭代器,因此您必须使用索引。
答案 8 :(得分:-1)
我已经读过迭代器在Swing中非常有用,特别是如果你在paintComponent(Graphics g)
方法中迭代集合。
迭代器的好处是,您可以从多个线程迭代同一个集合,甚至可以使用方法remove()
删除该集合的元素,同时在其他地方同时访问该集合。
如果是底层的,则未指定迭代器的行为 在迭代以任何方式进行时,都会修改集合 除了通过调用此方法。 这意味着如果同时修改同一个集合,则不会定义方法remove的行为。但是方法删除效果很好即使你在调用iterator.remove()的同时遍历同一个集合也是如此!我在我的GUI中使用过它。
根据我的经验,有必要在方法paintComponent
中使用迭代器,而不是循环for
或for-each
!