- 能夠說出集合與數組的區別
- 說出Collection集合的常用功能
- 能夠使用迭代器對集合進行取元素
- 能夠說出集合的使用細節
- 能夠使用集合存儲自定義類型
- 能夠使用foreach循環遍歷集合
- 能夠使用泛型定義集合對象
- 能夠理解泛型上下限
- 能夠闡述泛型通配符的作用
Collection集合
1. 概述
- 集合:集合是java中提供的一種容器,可以用來存儲多個數據。
集合和數組既然都是容器,它們有什麼區別呢?
區別
- 數組的長度是固定的。集合的長度是可變的。
- 數組中存儲的是同一類型的元素,可以存儲基本數據類型值。集合存儲的都是對象。而且對象的類型可以不一致。
- 在開發中當對象較多的時候,使用集合進行存儲。
2. 集合框架
JAVASE提供了滿足各種需求的API(類和接口),在使用這些API前,先了解其繼承與接口操作架構,才能瞭解何時採用哪個類,以及類之間如何彼此合作,從而達到靈活應用。
集合按照其存儲結構可以分爲兩大類,分別是單列集合java.util.Collection
和雙列集合java.util.Map
。
3. Collection
Collection:單列集合類的根接口,用於存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是java.util.List
和java.util.Set
。
List
List
的特點是元素有序、元素可重複。Set
的特點是元素無序,而且不可重複。List
接口的主要實現類有java.util.ArrayList
和java.util.LinkedList
Set
Set
接口的主要實現類有java.util.HashSet
和java.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.Iterator
。Iterator
接口也是Java集合中的一員,但它與Collection
、Map
接口有所不同,Collection
接口與Map
接口主要用於存儲元素,而Iterator
主要用於迭代訪問(即遍歷)Collection
中的元素,因此Iterator
對象也被稱爲迭代器。想要遍歷Collection集合,那麼就要獲取該集合迭代器完成迭代操作。
獲取迭代器的方法
Iterator迭代器,是一個接口,我們無法直接使用,需要使用Iterator接口的實現類對象,獲取實現類的方式比較特殊
Collection接口中有一個方法,叫iterator(),這個方法返回的就是迭代器的實現類對象
public Iterator iterator()
: 獲取集合對應的迭代器,用來遍歷集合中的元素的。
實現原理
迭代即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱爲迭代。
2. Iterator接口的常用方法
public E next()
:返回迭代的下一個元素,取出集合中的下一個元素。public boolean hasNext()
:如果仍有元素可以迭代,則返回 true。
3. 迭代器的使用步驟 【重要】
- 使用集合中的方法
iterator()
獲取迭代器的實現類對象,使用Iterator
接口接收(多態)
Iterator it = coll.iterator(); // coll.iterator();獲取一個迭代器(實現類對象)
- 使用Iterator接口中的方法
hasNext
判斷還有沒有下一個元素
boolean b = it.hasNext();
- 使用
Iterator
接口中的方法next
取出集合中的下一個元素
Object o = it.next();
注意事項
Iterator<E>
接口也是有泛型的,迭代器的泛型跟着集合走【集合是什麼泛型,迭代器就是什麼泛型】 。
Collection<String> coll = new ArrayList<>();
// <String>
Iterator<String> it = coll.iterator();
- 在進行集合元素取出時,如果集合中已經沒有元素了,還繼續使用迭代器的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遍歷集合的整個過程
- 當遍歷集合時,首先通過調用集合的iterator()方法獲得迭代器對象
- 然後使用hashNext()方法判斷集合中是否存在下一個元素
- 如果存在,則調用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);
}
}
}