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]
}
}