Java中集合框架、Collection接口、迭代器Iterator、List接口、ListIterator列表迭代器

集合框架

  • 集合類的由來
    • 面向?qū)ο笳Z言對事物的體現(xiàn)都是以對象的形式,所以為了方便對多個對象的操作,Java就提供了集合類。
  • 數(shù)組和集合類同是容器,他們有何區(qū)別
    • 數(shù)組雖然也可以存儲對象,但長度是固定的。數(shù)組中可以存儲基本數(shù)據(jù)類型。
    • 集合長度是可變的。集合只能存儲對象。
  • 集合類的特點
    • 集合只用于存儲對象,集合長度是可變的,集合可以存儲不同類型的對象。

下面我畫了兩張圖,給出了組成集合框架的各個接口與類的層次結(jié)構(gòu)(圖畫的有點丑,莫怪)

collection接口.png
Map接口.png

從上面的圖中可以看出集合框架中提供的主要接口有6個,主要類有10個。以及接口和類之間的繼承和實現(xiàn)關(guān)系。

Collection接口

  • 概述(通過查看API)
    • Collection 層次結(jié)構(gòu)中的根接口。Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重復(fù)的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。
  • Collection的功能概述:
    • 1:添加功能
      • boolean add(Object obj):添加一個元素
      • boolean addAll(Collection c):添加一個集合的元素
    • 2:刪除功能
      • void clear():移除所有元素
      • boolean remove(Object o):移除一個元素
      • boolean removeAll(Collection c):移除一個集合的元素
    • 3:判斷功能
      • boolean contains(Object o):判斷集合中是否包含指定的元素
      • boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素
      • boolean isEmpty():判斷集合是否為空
    • 4:獲取功能
      • Iterator iterator()
    • 5:長度功能
      • int size():元素的個數(shù)
    • 6:交集功能
      • boolean retainAll(Collection c)
    • 7:把集合轉(zhuǎn)換為數(shù)組
      • Object[] toArray()
public class CollectionDemo { 
public static void main(String[] args) { 
// 測試不帶All的方法 
// 創(chuàng)建集合對象
 // Collection c = new Collection(); //錯誤,因為接口不能實例化
 Collection c = new ArrayList(); 
// boolean add(Object obj):添加一個元素 
c.add("hello"); 
c.add("world"); 
c.add("java");
 // boolean isEmpty():判斷集合是否為空 System.out.println("isEmpty:"+c.isEmpty()); 
//int size():元素的個數(shù) 
System.out.println("size:"+c.size()); 
System.out.println("c:" + c); 
}
}
//我們還可以移除判斷一下
 // void clear():移除所有元素 
c.clear();
 //要是移除了所有元素,上面的輸出結(jié)果,isEmpty就成為true,size=0,c集合就為空[] 
// boolean remove(Object o):移除一個元素 System.out.println("remove:" + c.remove("hello"));//上面我們給集合中add了hello,所以會返回true System.out.println("remove:" + c.remove("javaee"));//集合中沒有javaee,所以肯定會返回false
// boolean contains(Object o):判斷集合中是否包含指定的元素 System.out.println("contains:"+c.contains("hello"));//和上面一樣會返回true System.out.println("contains:"+c.contains("android"));//會返回false

兩個集合的交集

public class CollectionDemo {
    public static void main(String[] args) {
 // 創(chuàng)建集合1
 Collection c1 = new ArrayList(); 
c1.add("abc1"); 
c1.add("abc2"); 
// 創(chuàng)建集合2 
Collection c2 = new ArrayList(); 
c2.add("abc1"); 
c2.add("abc2"); 
c2.add("abc3"); 
c2.add("abc4"); 
c2.add("abc5"); 
c1.retainAll(c2); 
System.out.println("c1:" + c1);//c1:[abc1, abc2] System.out.println("c2:" + c2);//c2:[abc1, abc2, abc3, abc4, abc5] 
}
}

集合轉(zhuǎn)成數(shù)組,可以實現(xiàn)集合的遍歷

public class CollectionDemo { 
public static void main(String[] args) { 
  // 創(chuàng)建集合對象 
Collection c = new ArrayList(); 
// 添加元素 
c.add("hello");// Object obj = "hello"; 向上轉(zhuǎn)型
 c.add("world"); 
c.add("java");
 //遍歷 
Object[] objs = c.toArray(); 
for (int x = 0; x < objs.length; x++) { 
     String s = (String) objs[x]; 
     System.out.println(s + "---" + s.length()); 
  } 
 }
}

迭代器Iterator

  • Iterator接口概述
    • 對 collection 進行迭代的迭代器
    • 依賴于集合而存在
  • 成員方法
    • boolean hasNext()
    • next()

迭代器它是集合的專用遍歷方式,下面我們來看它怎么對數(shù)據(jù)進行操作

public class IteratorDemo { 
   public static void main(String[] args) { 
   // 創(chuàng)建集合對象 
   Collection c = new ArrayList();
   // 創(chuàng)建并添加元素 
c.add("hello"); c.add("world"); c.add("java");
Iterator it = c.iterator(); // 實際返回的肯定是子類對象,這里是多態(tài)
 while (it.hasNext()) {
     String s = (String) it.next();
     System.out.println(s); 
  } 
 }
}

List接口

  • List接口概述
    • 有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。
    • 與 set 不同,列表通常允許重復(fù)的元素。

所以我們可以看出List和Set的區(qū)別很明顯

  • List接口:元素是有序的,元素可以重復(fù),因為該集合體系有索引
  • Set接口:元素是無序,元素不可以重復(fù),不能索引

下面我們來看List里面都有哪些成員方法

  • List接口成員方法
    • 添加功能
      void add(int index,Object element):在指定位置添加元素

    • 獲取功能
      Object get(int index):獲取指定位置的元素

    • 刪除功能
      Object remove(int index):根據(jù)索引刪除元素,返回被刪除的元素

    • 修改功能
      Object set(int index,Object element):根據(jù)索引修改元素,返回被修飾的元素

下面我們來逐個學(xué)習(xí)他的成員方法

public class ListDemo { 
   public static void main(String[] args) { 
   // 我們先創(chuàng)建集合對象 
   List list = new ArrayList(); 
   // 添加元素 
   list.add("hello"); 
   list.add("world"); 
   list.add("java"); 
   System.out.println("原集合:" + list); 

   //在指定位置添加元素 
   list.add(1, "android"); 
   System.out.println("添加后:" + list); 
   list.add(11, "javaee");//這樣會有問題,出現(xiàn)IndexOutOfBoundsException 
   //獲取指定位置的元素 
   System.out.println("獲取后:" + list.get(1)); 
   //根據(jù)索引刪除元素,返回被刪除的元素 
   list.remove(1); 
   System.out.println("刪除后:" + list); 
   //根據(jù)索引修改元素,返回被修飾的元素 
   list.set(1, "javaee"); 
   System.out.println("修改后:" +list); 
   // 獲取所有元素 
   for (int x = 0; x < list.size(); x++) { 
         System.out.println(list.get(x)); 
   } 
  // 通過迭代器 
   Iterator it = list.iterator();
   while (it.hasNext()) { 
          System.out.println("next:" + it.next()); 
    }
}

ListIterator列表迭代器

上面我們學(xué)習(xí)了Iterator迭代器,現(xiàn)在又來一個ListIterator,它又是什么呢?它是List集合特有的迭代器,
下面我們通過一道題來弄懂它。
我有一個集合,如下,請問,我想判斷里面有沒有”world”這個元素,如果有,我就添加一個”javaee”元素,請寫代碼實現(xiàn)。

public class ListIteratorDemo2 { 
    public static void main(String[] args) {
        // 創(chuàng)建List集合對象 
        List list = new ArrayList(); 
       // 添加元素
       list.add("hello"); 
       list.add("world");
       list.add("java"); 
       // 看到這里,我們會想到用我們上面學(xué)的迭代器遍歷   
       Iterator it = list.iterator();
       while (it.hasNext()) {
               String s = (String) it.next(); 
               if ("world".equals(s)) { 
                     list.add("javaee"); 
               } 
       }
       System.out.println("list:" + list); 
    }
}

運行出錯,這是什么錯呢?通過看API我們可以知道
ConcurrentModificationException:當方法檢測到對象的并發(fā)修改,但不允許這種修改時,拋出此異常。

  • 產(chǎn)生的原因
    • 迭代器是依賴于集合而存在的,在判斷成功后,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫并發(fā)修改異常。
    • 其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
  • 如何解決呢?
    • 迭代器迭代元素,迭代器修改元素
    • 集合遍歷元素,集合修改元素(普通for)
// 方式1:迭代器迭代元素,迭代器修改元素 
// 而Iterator迭代器卻沒有添加功能,所以我們使用其子接口ListIterator ListIterator lit = list.listIterator();
 while (lit.hasNext()) { 
     String s = (String) lit.next(); 
     if ("world".equals(s)) { 
         lit.add("javaee"); 
     } 
} 
  System.out.println("使用ListIterator迭代器后得到的結(jié)果:" + list); 
   // 方式2:集合遍歷元素,集合修改元素(普通for) 
   for (int x = 0; x < list.size(); x++) { 
         String s = (String) list.get(x); 
         if ("world".equals(s)) { list.add("javaee"); 
    } 
 } 
 System.out.println("使用集合遍歷后得到的結(jié)果:" + list);

可以發(fā)現(xiàn)我們使用ListIterator迭代器后得到的結(jié)果(元素是跟在剛才迭代的元素后面的)
使用集合遍歷元素后,集合修改元素得到的結(jié)果(元素在最后添加的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 寫在前面自開始在公司實習(xí)以來,經(jīng)常都要用到集合框架。不僅后臺要用,在前臺做數(shù)據(jù)交互的時候用得也多。所以我想著是時候...
    EakonZhao閱讀 3,342評論 0 12
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 959評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,652評論 18 399
  • 一.集合框架 1.集合框架(對象數(shù)組的概述和使用) a.案例演示 * 需求:我有5個學(xué)生,請把這個5個學(xué)生的信息存...
    夢游的沙師弟閱讀 624評論 0 1
  • 前言:一名iOS開發(fā)工程師,正在學(xué)習(xí)Android開發(fā),期待各路大神指點和學(xué)習(xí)交流.學(xué)習(xí)交流討論及資料獲取請關(guān)注:...
    極客James閱讀 4,517評論 0 5

友情鏈接更多精彩內(nèi)容