1.集合的迭代操作
把集合做的元素一个一个的遍历取出来.---------------------------------------------------------------------
迭代器对象:
Iterator: 迭代器对象,只能从上往下迭代.
boolean hasNext(); 判断当前指针后是否有下一个元素
Object next():获取指针的下一个元素,并且移动指针.
ListIterator: 是Iterator接口的子接口,支持双向迭代,从上往下迭代,从下往上迭代.
Enumeration:古老的迭代器对象,现在已经被Iterator取代了. 适用于古老的Vector类.
import java.util.ArrayList;
import java.util.Iterator;
public class CollectionDemo7 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
//1.for循环
for (int i = 0; i < list.size(); i++) {
String ele = list.get(i);
System.out.println(ele);
}
System.out.println("-----------------------------------");
//2.for-each增强for循环
for (String ele : list) {
System.out.println(ele);
}
System.out.println("-----------------------------------");
//3.使用while循环的Iterator迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String ele = (String) iterator.next();
System.out.println(ele);
}
System.out.println("-----------------------------------");
//4.使用for循环的Iterator迭代器,这种更好,因为for循环中的变量用完之后就清理了,不会占用内存
for (Iterator iterator2 = list.iterator(); iterator2.hasNext();) {
String ele = (String) iterator2.next();
System.out.println(ele);
}
}
}
import java.util.Enumeration;
import java.util.Vector;
public class CollectionDemo8 {
public static void main(String[] args) {
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
vector.add(3);
vector.add(4);
//古老的迭代器对象
Enumeration<Integer> elements = vector.elements();
while (elements.hasMoreElements()) {
Integer ele = (Integer) elements.nextElement();
System.out.println(ele);
}
System.out.println("---------------------------------------------------");
//古老的迭代器对象,使用for循环
for(Enumeration<Integer> en =vector.elements();en.hasMoreElements();){
System.out.println(en.nextElement());
}
}
}
深入分析for-each和迭代器:
1):foreach可以操作数组: 底层依然采用for循环+ 索引来获取数组元素.
2):foreach可以操作Iterable的实例: 底层其实采用的Iterator(迭代器).
-----------------------------------------------------------------
直接使用foreach迭代数组和集合元素即可,简单.
for-each的语法格式:
for(类型 变量 :数组名/Iterable的实例){
//TODO
}
注意:当需要边迭代集合元素,边删除指定的元素时:此时只能使用迭代器.而且只能使用迭代器对象的remove方法.
import java.util.ArrayList;
import java.util.List;
public class CollectionDemo9 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
for (String ele : list) {
System.out.println(ele);
list.remove(0);
}
}
}
在迭代集合的时候,边迭代边删除是非常常用的操作:
如何解决并发修改异常呢?
不要使用集合对象的删除方法.
在Collection接口中存在删除指定元素的方法:boolean remove(Object ele);该方法只能从集合中删除元素,不能把迭代器中指定的元素也删除.
所以:我们得使用Iterator中的remove方法.该方法会从两个线程中同时移除被删除的元素,.保证了两个线程的同步.
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionDemo9 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
/* for (String ele : list) {
System.out.println(ele);
list.remove(0);
}*/
System.out.println(list);//移除前打印[A, B, C, D]
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String ele = (String) iterator.next();
if ("C".equals(ele)) {
iterator.remove();
}
}
System.out.println(list);//移除后打印[A, B, D]
}
}