天天看點

Collection接口和疊代器

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集合共有)

Collection接口和疊代器

疊代器:就是實作了一個Iterator接口的每一個容器内部的内部對象

       該對象必須依賴于具體容器,因為每一個容器的資料結構都不同。是以該疊代器對象是在容器中進行内部實作的。(依賴于容器的内部類)

       對于使用容器者而言,具體的實作不重要,隻要通過容器擷取到該實作的疊代器的對象即可,也就是iterator方法。

       Iterator接口就是對所有的Collection容器進行元素取出的公共接口。

       其實就是抓娃娃遊戲機中的夾子!

4、ListIterator接口(List集合特有)

Collection接口和疊代器

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

繼續閱讀