Collection接口 & Iterator迭代器 & 增強for循環

  • 能夠說出集合與數組的區別
  • 說出Collection集合的常用功能
  • 能夠使用迭代器對集合進行取元素
  • 能夠說出集合的使用細節
  • 能夠使用集合存儲自定義類型
  • 能夠使用foreach循環遍歷集合
  • 能夠使用泛型定義集合對象
  • 能夠理解泛型上下限
  • 能夠闡述泛型通配符的作用

在這裏插入圖片描述

Collection集合

1. 概述

  • 集合:集合是java中提供的一種容器,可以用來存儲多個數據。

集合和數組既然都是容器,它們有什麼區別呢?

區別

  1. 數組的長度是固定的。集合的長度是可變的。
  2. 數組中存儲的是同一類型的元素,可以存儲基本數據類型值。集合存儲的都是對象。而且對象的類型可以不一致。
  3. 在開發中當對象較多的時候,使用集合進行存儲。

2. 集合框架

JAVASE提供了滿足各種需求的API(類和接口),在使用這些API前,先了解其繼承與接口操作架構,才能瞭解何時採用哪個類,以及類之間如何彼此合作,從而達到靈活應用。

集合按照其存儲結構可以分爲兩大類,分別是單列集合java.util.Collection和雙列集合java.util.Map

3. Collection

Collection:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是java.util.Listjava.util.Set

List

List的特點是元素有序、元素可重複。Set的特點是元素無序,而且不可重複List接口的主要實現類有java.util.ArrayListjava.util.LinkedList

Set

Set接口的主要實現類有java.util.HashSetjava.util.TreeSet

從上面的描述可以看出JDK中提供了豐富的集合類庫,接下來通過一張圖來描述整個集合類的繼承體系。

其中,橙色框裏填寫的都是接口類型,而藍色框裏填寫的都是具體的實現類。這幾天將針對圖中所列舉的集合類進行逐一地講解。

集合本身是一個工具,它存放在java.util包中。在Collection接口定義着單列集合框架中最最共性的內容。

4. 常用功能

Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用於操作所有的單列集合(共性方法)。方法如下:【不只有這些方法,還有很多】

  • public boolean add(E e): 把給定的對象添加到當前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e): 把給定的對象在當前集合中刪除。
  • public boolean contains(E e): 判斷當前集合中是否包含給定的對象。
  • public boolean isEmpty(): 判斷當前集合是否爲空。
  • public int size(): 返回集合中元素的個數。
  • public Object[] toArray(): 把集合中的元素,存儲到數組中。

有關Collection中的方法可不止上面這些,其他方法可以自行查看API學習

方法演示

  • public boolean add(E e): 把給定的對象添加到當前集合中 。

    一般都返回true,所以可以不用接收。

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

public class Demo01Collection {
    public static void main(String[] args) {
         //不允許存儲相同的元素 只存儲一次相同的值
        Collection<String> coll = new HashSet<>(); 
        System.out.println(coll);//重寫了toString方法  []

        coll.add("李四");
        coll.add("李四");
        coll.add("趙六");
        coll.add("田七");
        System.out.println(coll);//[張三, 李四, 趙六, 田七]
    }
}
  • public boolean remove(E e): 把給定的對象在當前集合中刪除。 【返回:true/false】

    集合中存在該元素,刪除元素,返回true

    集合中不存在該元素,刪除失敗,返回false

		coll.remove("趙六"); // 返回true
		coll.remove("趙四"); // 返回false        
  • public boolean contains(E e): 判斷當前集合中是否包含給定的對象。 【返回:true/false】
     	coll.contains("李四");
		coll.contains("趙四"); 
  • public boolean isEmpty(): 判斷當前集合是否爲空。【返回:true/false】
		coll.isEmpty();
  • public int size(): 返回集合中元素的個數。
        int size = coll.size();
        System.out.println("size:"+size);//size:3
  • public Object[] toArray(): 把集合中的元素,存儲到數組中。
        Object[] arr = coll.toArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
  • public void clear():清空集合中所有的元素。 【但是不刪除集合,集合還存在】
        coll.clear();
        System.out.println(coll);//[]
        System.out.println(coll.isEmpty());//true

Iterator迭代器

1. 概述

在程序開發中,經常需要遍歷集合中的所有元素。針對這種需求,JDK專門提供了一個接口java.util.IteratorIterator接口也是Java集合中的一員,但它與CollectionMap接口有所不同,Collection接口與Map接口主要用於存儲元素,而Iterator主要用於迭代訪問(即遍歷)Collection中的元素,因此Iterator對象也被稱爲迭代器。想要遍歷Collection集合,那麼就要獲取該集合迭代器完成迭代操作。

獲取迭代器的方法

Iterator迭代器,是一個接口,我們無法直接使用,需要使用Iterator接口的實現類對象,獲取實現類的方式比較特殊
Collection接口中有一個方法,叫iterator(),這個方法返回的就是迭代器的實現類對象

  • public Iterator iterator(): 獲取集合對應的迭代器,用來遍歷集合中的元素的。

實現原理

迭代即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來繼續在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱爲迭代。

2. Iterator接口的常用方法

  • public E next():返回迭代的下一個元素,取出集合中的下一個元素。
  • public boolean hasNext():如果仍有元素可以迭代,則返回 true。

3. 迭代器的使用步驟 【重要】

  1. 使用集合中的方法iterator()獲取迭代器的實現類對象,使用Iterator接口接收(多態)
Iterator it = coll.iterator();  // coll.iterator();獲取一個迭代器(實現類對象)
  1. 使用Iterator接口中的方法hasNext判斷還有沒有下一個元素
boolean b = it.hasNext();        
  1. 使用Iterator接口中的方法next取出集合中的下一個元素
Object o = it.next();

注意事項

  1. Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走【集合是什麼泛型,迭代器就是什麼泛型】 。
Collection<String> coll = new ArrayList<>();
// <String>
Iterator<String> it = coll.iterator(); 
  1. 在進行集合元素取出時,如果集合中已經沒有元素了,還繼續使用迭代器的next方法,將會發生:NoSuchElementException沒有元素異常。

使用演示

如何使用Iterator迭代集合中元素

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Demo01Iterator {

    public static void main(String[] args) {
        // 創建一個字符串
        Collection<String> coll = new ArrayList<>();
        // 往集合中添加元素
        coll.add("aaa");
        coll.add("bbb");
        coll.add("ccc");

        //   	接口        接收    實現類對象
        Iterator<String> it = coll.iterator();  // 多態
    	// 方法1
        while (it.hasNext()) {
            String str = it.next();
            System.out.println(str);
        }
        System.out.println("========================");
        // 方法2
        for(Iterator<String> it2 = coll.iterator();it2.hasNext();){
            String e = it2.next();
            System.out.println(e);
        }
        // 沒有元素,在取出元素會拋出:NoSuchElementException沒有元素異常
    }
}

結果:

aaa
bbb
ccc
========================
aaa
bbb
ccc

4 迭代器的實現原理

Iterator遍歷集合的整個過程

  1. 當遍歷集合時,首先通過調用集合的iterator()方法獲得迭代器對象
  2. 然後使用hashNext()方法判斷集合中是否存在下一個元素
  3. 如果存在,則調用next()方法將元素取出,否則說明已到達了集合末尾,停止遍歷元素。

過程圖解

Iterator迭代器對象在遍歷集合時,內部採用指針的方式來跟蹤集合中的元素

  • 在調用Iterator的next方法之前,迭代器的索引位於第一個元素之前,不指向任何元素
  • 當第一次調用迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回
  • 當再次調用next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推
  • 直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。

接下來通過一個圖例來演示Iterator對象迭代元素的過程:

迭代器的實現原理圖

增強for 【JDK1.5】

增強for循環(也稱for each循環)是JDK1.5以後出來的一個高級for循環,專門用來遍歷數組和集合的。

它的內部原理其實是個Iterator迭代器,簡化了迭代器的書寫,所以在遍歷的過程中,不能對集合中的元素進行增刪操作

所有的單列集合都可以使用增強for(ForEach)

Collection<E>extends Iterable<E>:

實現這個接口允許對象成爲 “foreach” 語句的目標。

public interface Iterable<T>

格式

  • 它用於遍歷Collection和數組。通常只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。
  • 新式for循環必須有被遍歷的目標。目標只能是Collection或者是數組。新式for僅僅作爲遍歷操作出現
for(集合/數組的數據類型 變量名 : Collection集合名/數組名){ 
  	//寫操作代碼
   System.out.println(變量名);
}

1. 遍歷數組

public class NBForDemo1 {
    public static void main(String[] args) {
		int[] arr = {3,5,6,87};
       	//使用增強for遍歷數組
		for(int a : arr){ //a:變量名 arr:數組名稱
			System.out.println(a);
		}
	}
}

結果:

3
5
6
87

2. 遍歷集合

public class NBFor {
    public static void main(String[] args) {        
    	Collection<String> coll = new ArrayList<String>();
    	coll.add("小S");
    	coll.add("大S");
    	coll.add("老S");
    	//使用增強for遍歷
    	for(String s :coll){ //變量名s:接收集合裏的元素
    		System.out.println(s);
    	}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章