一.集合的迭代操作:
-
把集合做的元素一个一个的遍历取出来.
-
迭代器对象:
- Iterator:迭代器对象,只能从上往下迭代
- boolean hasNext();判断当前指针后是否有下一个元素
- Object next();获取指针的下一个元素,并且移动指针.
- ListIterator:是Iterator接口的子接口,支持双向迭代,从上往下迭代,从下往上迭代.
- Enumerration:古老的迭代器对象,已经被Iteration取代了,适用于古老的Vector类
新建类IteratorDemo
public class IteratorDemo {
public static void main(String[] args) {
List l = new ArrayList();
l.add("A");
l.add("B");
l.add("C");
l.add("D");
System.out.println("-----------for-----------");
//方式一:for
for (int i = 0; i < l.size(); i++) {
System.out.println(l.get(i));
}
System.out.println("---------for each-------------");
//方式二:for-each
for(Object o : l) {
System.out.println(o);
}
System.out.println("--------iterator while--------------");
//方式三:iterator
Iterator i = l.iterator();
while (i.hasNext()) {
System.out.println(i.next());
}
System.out.println("-------iterator for---------------");
//方式三:使用for - iterator
for (Iterator it = l.iterator(); it.hasNext();){
System.out.println(it.next());
}
System.out.println("-------Enumeration while---------------");
//方式四:Enumeration//古老的迭代器,已经不用了
Vector v = new Vector();
v.add("A");
v.add("B");
v.add("C");
v.add("D");
Enumeration en = v.elements();
while (en.hasMoreElements()){
System.out.println(en.nextElement());
}
}
}
二.for -each的深入分析和迭代器
- foreach 可以操作数组: 底层依然采用for循环+,索引来获取数组元素
- foreach可以操作Iterable的实例: 底层其实采用的Iterator(迭代器)
- 以后使用for - each迭代数组和集合元素即可.
但是,当需要边迭代集合元素,变删除指定的元素使用for-each时,发生异常
-
当迭代的时候,会把操作数拷贝到Iterator类里边,如果这两个数不相等(调用remove方法操作数会加一),报错ConcurrentModificationException
-
如何解决并发修改异常:
- 不要使用集合对象的删除方法.
- 在Collection接口中存在删除指定元素的方法boolean remove(Object ele);
- 该方法只能从集合中删除元素,不能把迭代器中的指定元素也删除.
- 使用Iterator中的remove方法.
- 该方法会从两个线程中同时移除被删除的元素,保证了两个线程的同步.
新建类ForeachDemo
public class ForeachDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("A");
al.add("B");
al.add("C");
al.add("D");
System.out.println(al.toString());
for (Object object : al) {
System.out.println(object);
}
System.out.println("----------------------");
Iterator it = al.iterator();
while (it.hasNext()) {
if ("C".equals(it.next())) {
it.remove();
}
}
System.out.println(al.toString());
}
}