一.集合的迭代操作:
把集合做的元素一个一个的遍历取出来.
二.迭代器对象
Iterator: 迭代器对象,只能从上往下迭代.
boolean hasNext(); 判断当前指针后是否有下一个元素
Object next():获取指针的下一个元素,并且移动指针.
ListIterator: 是Iterator接口的子接口,支持双向迭代,从上往下迭代,从下往上迭代.
Enumeration:古老的迭代器对象,现在已经被Iterator取代了. 适用于古老的Vector类.
public class IteratorDemo {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
//方式一:使用for循环
for (int index=0;index<list.size();index++){
Object ele = list.get(index);
System.out.println(ele);
}
//方式二:使用foreach循环
for (Object ele : list) {
System.out.println(ele);
}
//方式三:使用while操作iterator迭代器
Iterator<Object> it = list.iterator();//得到迭代器对象
while (it.hasNext()){
Object ele = it.next();
System.out.println(ele);
}
//方式四:使用for循环来操作迭代器
for(Iterator<Object> it1 = list.iterator();it1.hasNext();){
Object ele = it1.next();
System.out.println(ele);
}
//方式五:使用古老的迭代器Enumeration(操作vector),现在基本不使用
Vector<Object> v = new Vector<>();
v.add("A");
v.add("B");
v.add("C");
Enumeration<Object> e = v.elements();
while (e.hasMoreElements()){
Object ele = e.nextElement();
System.out.println(ele);
}
}
}
迭代器的指针:
三.深入分析for-each和迭代器:
1):foreach可以操作数组: 底层依然采用for循环+ 索引来获取数组元素.
2):foreach可以操作Iterable的实例:底层其实采用的Iterator(迭代器).
直接使用foreach迭代数组和集合元素即可,简单.
反编译:
四.边迭代边删除集合中的元素的问题:
当需要边迭代集合元素,边删除指定的元素时:此时只能使用迭代器.
而且只能使用迭代器对象的remove方法.
public class IteratorDemo1 {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
/*for (Object ele : list) {
if("C".equals(ele)){
list.remove(ele);//ConcurrentModificationException并发修改异常
}
System.out.println(ele);
}*/
//使用迭代器的删除方法
Iterator<Object> it = list.iterator();
while (it.hasNext()){
if("C".equals(it.next())){
it.remove();
}
}
System.out.println(list);//[A, B]
}
}
原理和解决办法:
在迭代集合的时候,边迭代边删除是非常常用的操作:
如何解决并发修改异常呢?
不要使用集合对象的删除方法.
在Collection接口中存在删除指定元素的方法:boolean remove(Object ele);
该方法只能从集合中删除元素,不能把迭代器中指定的元素也删除.
王道在于:使用Iterator中的remove方法.
该方法会从两个线程中同时移除被删除的元素,.保证了两个线程的同步.