2017-09-18 21 views
-1

我学习有关Collections和问题自动启动...我可以在集合上使用Iterator来获取Java中的元素吗?

我了解到,一个ArrayList我可以使用的方法add()remove()上的元素;但现在我正在阅读,有另一种方法,它是使用对象Iterator及其方法。

那么我可以自由选择Iterator而不是ArrayList的方法吗? 如果是,有利有弊吗?

我阅读: 1)询问一个集合,使用一种叫做iterator()的方法给你一个迭代器。该迭代器已准备好返回序列中的第一个元素。 2)获取下一个对象序列next(); 3)查看序列中是否有更多的对象,其中hasNext(); 4)删除迭代器返回的最后一个元素remove();

+0

是的,你不能,我宁愿使用增强的'for'(相当于C#的'foreach')来添加或删除东西。 –

+0

@alfasin当然,您可以使用迭代器将元素添加到列表中:['listIterator.add(E e)'](https://docs.oracle.com/javase/8/docs/api/java/util/ListIterator .html#add-E-) – Andreas

+0

你想做什么?请分享您现在的代码。 –

回答

3

迭代器是一个相对较旧的构造,用于遍历利用内部结构(比外部循环更优化)的元素。

有时迭代器允许更多:

for (Car car : cars) { 
    if (car.diesel) { 
     cars.remove(car); // ERROR while looping cars one cannot alter it. 
    } 
} 

for (Iterator<Car> iter = cars.iterator(); iter.hasNext();) { 
    Car car = iter.next(); 
    if (car.diesel) { 
     iter.remove(); // FINE 
    } 
} 

for (int i = 0; i < cars.size(); ++i) { 
    Car car = cars.get(i); // Could be slow for a LinkedList 
    if (car.diesel) { 
     cars.remove(i); // FINE 
     --i; // So we do not skip the next, now at index i. 
    } 
} 

和Java 8目前拥有,但是这是另一种(非常漂亮)的方式来收集。

+0

那么,你确认我的话吗? – Clash

+0

迭代器主要用于在集合中漫步。 ListIterator更像是List上的光标。迭代器比for-each('for:')更容易输入,但允许修改循环内的集合。所以我会尽可能地为每一个做。虽然,是的,你似乎已经掌握了这些机制。顺便说一下,Java 8流完美地处理集合。 –

相关问题