Collection接口和疊代器
1、Collection的常見方法:
1,添加。
boolean add(Object obj):
boolean addAll(Collection coll):
2,删除。
boolean remove(object obj):
boolean removeAll(Collection coll); //将兩個集合中的相同元素從調用removeAll的集合中删除。(删除相同,保留不同)
void clear();
3,判斷:
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判斷集合中是否有元素。
4,擷取:
int size():
Iterator iterator():取出元素的方式:疊代器。
5,其他:
boolean retainAll(Collection coll);取交集。//取交集,保留和指定的集合相同的元素,而删除不同的元素。(删除不同,保留相同)和removeAll功能相反。
Object[] toArray():将集合轉成數組。
2、Collection接口的繼承接口(兩大體系)
|--List:有序(存入和取出的順序一緻),元素都有索引(角标),元素可以重複。
|--Set:元素不能重複,無序。
3、疊代器Iterator(collection集合共有)

疊代器:就是實作了一個Iterator接口的每一個容器内部的内部對象
該對象必須依賴于具體容器,因為每一個容器的資料結構都不同。是以該疊代器對象是在容器中進行内部實作的。(依賴于容器的内部類)
對于使用容器者而言,具體的實作不重要,隻要通過容器擷取到該實作的疊代器的對象即可,也就是iterator方法。
Iterator接口就是對所有的Collection容器進行元素取出的公共接口。
其實就是抓娃娃遊戲機中的夾子!
4、ListIterator接口(List集合特有)
5、疊代器示範:
5.1執行個體代碼
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println("list:" + list);
/*
*//Iterator 疊代器周遊 Iterator it=list.iterator(); while(it.hasNext()){
*Object obj=it.next(); if(obj.equals("abc2")){
*list.add("abc9");//java.util.ConcurrentModificationException //某個線程在
*Collection 上進行疊代時,通常不允許另一個線性修改該 Collection
*
*//在疊代器過程中,不要使用集合操作元素,容易出現異常。
*//可以使用Iterator接口的子接口ListIterator來完成在疊代中對元素進行更多的操作。 } else
*System.out.println("next:"+obj); }System.out.println("list:"+list);
*/
// ListIterator疊代器周遊
ListIterator lit = list.listIterator();// 它可以實作在疊代過程中完成對元素的增删改查。
// 注意:隻有list集合具備該疊代功能.
while (lit.hasNext()) {
Object obj = lit.next();
if ("abc2".equals(obj)) {
lit.set("abc99");
} else {
System.out.println("next:" + obj);
}
}
System.out.println("修改後list:" + list);
}
}
5.2疊代器Iterator和ListIterator比較
Iterator:
(1)Collection集合共有
(2)可以周遊集合中的元素,但是隻能單向周遊
(3)可以删除元素
(4)不可以修改元素
(5)不能定位目前索引的位置
ListIterator:
(1)List集合特有
(2)可以周遊集合中的元素,可以雙向周遊
(3)可以删除元素
(4)可以修改元素,在周遊的同時實作對象的添加(add方法)或者對象的修改(set方法)
(5)可以定位目前索引的位置(nextIndex方法和previousIndex方法)
5.3疊代器錯誤使用案例與解析
5.3.1錯誤使用案例
(1)Iterator使用
【1】代碼
package collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class IteratorFirst {
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println("list:" + list);
// Iterator 疊代器周遊
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if (obj.equals("abc2")) {
list.add("abc9");// java.util.ConcurrentModificationException
//某個線程在Collection 上進行疊代時,通常不允許另一個線性修改該 Collection
// 在疊代器過程中,不要使用集合操作元素,容易出現異常。
// 可以使用Iterator接口的子接口ListIterator來完成在疊代中對元素進行更多的操作。 } else
System.out.println("next:" + obj);
}
}
System.out.println("list:" + list);
}
}
【2】結果
list:[abc1,abc2, abc3]
next:abc2
Exceptionin thread "main" java.util.ConcurrentModificationException
atjava.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at collection.IteratorFirst.main(IteratorFirst.java:21)
(2)ListIterator使用
【1】代碼
package collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class IteratorTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println("list:" + list);
// ListIterator疊代器周遊
ListIterator lit = list.listIterator();// 它可以實作在疊代過程中完成對元素的增删改查。
// 注意:隻有list集合具備該疊代功能.
while (lit.hasNext()) {
Object obj = lit.next();
if ("abc2".equals(obj)) {
// lit.set("abc99");//ListIterator方法修改元素,沒有問題
list.add("abc88");//在疊代器便利時,利用list集合的方法添加或修改元素,會抛出異常
//java.util.ConcurrentModificationException
} else {
System.out.println("next:" + obj);
}
}
}
}
【2】結果
list:[abc1,abc2, abc3]
next:abc1
Exceptionin thread "main" java.util.ConcurrentModificationException
atjava.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at collection.IteratorTest.main(IteratorTest.java:22)
5.3.2解析
(1)在利用疊代器進行周遊集合a時,不能利用集合a的方法,去修改或者添加元素。否則會抛出異常:ConcurrentModificationException
備注:ConcurrentModificationException---------某個線程在Collection上進行疊代時,通常不允許另一個線性修改該 Collection。通常在這些情況下,疊代的結果是不确定的。如果檢測到這種行為,一些疊代器實作(包括 JRE提供的所有通用collection 實作)可能選擇抛出此異常
(2)隻能利用疊代器自身的方法去修改,目前正在周遊的集合a。其中Iterator隻能删除元素,不能修改集合元素;
而ListIterator不但可以删除元素,而且可以在周遊的同時,給集合添加元素或者修改集合中的元素内容
5.4 Iterator和ListIterator比較參考文章
CSDN博文:JAVA中ListIterator和Iterator詳解與辨析
位址:http://blog.csdn.net/longshengguoji/article/details/41551491