學(xué)習(xí)目標(biāo)
- 能夠說出集合與數(shù)組的區(qū)別
- Collection類及其子類
- Iterator原理及使用
- 什么是泛型,泛型得使用好處
- 泛型通配符的使用
問題一 集合和數(shù)組既然都是容器,它們有啥區(qū)別呢?
- 數(shù)組的長度是固定的。集合的長度是可變的。
- 數(shù)組中存儲的是同一類型的元素,可以存儲基本數(shù)據(jù)類型值。集合存儲的都是對象。而且對象的類型可以不 一致。在開發(fā)中一般當(dāng)對象多的時候,使用集合進(jìn)行存儲。
問題二 Collection類及其子類有哪些?

image
Collection是所有單列接口得父接口,下列是Collection接口得通用方法。
public boolean add(E e) : 把給定的對象添加到當(dāng)前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e) : 把給定的對象在當(dāng)前集合中刪除。
public boolean contains(E e) : 判斷當(dāng)前集合中是否包含給定的對象。
public boolean isEmpty() : 判斷當(dāng)前集合是否為空。 - public int size() : 返回集合中元素的個數(shù)。
public Object[] toArray() : 把集合中的元素,存儲到數(shù)組中。
問題三 Iterator原理及使用
Collection 接口與 Map 接口主要用于存儲元素,而 Iterator 主要用于迭代訪問(即遍歷) Collection 中的元 素,因此 Iterator 對象也被稱為迭代器。
即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個 元素取出來,繼續(xù)在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業(yè) 術(shù)語稱為迭代。
public static void main(String[] args) {
// 使用多態(tài)方式 創(chuàng)建對象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
//遍歷 //使用迭代器 遍歷 每個集合對象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的數(shù)據(jù)類型
while (it.hasNext()) { //判斷是否有迭代元素
String s = it.next();//獲取迭代出的元素
System.out.println(s);
}
}
問題四 什么是泛型,泛型得使用好處?
定義:在類或方法中提前聲明未知類型得對象
好處:將運(yùn)行時期的ClassCastException,轉(zhuǎn)移到了編譯時期變成了編譯失敗。避免了類型強(qiáng)轉(zhuǎn)的麻煩。
問題五 泛型通配符的使用?
當(dāng)使用泛型類或者接口時,傳遞的數(shù)據(jù)中,泛型類型不確定,可以通過通配符<?>表示。但是一旦使用泛型的通配 符后,只能使用Object類中的共性方法,集合中元素自身方法無法使用。
泛型的通配符:不知道使用什么類型來接收的時候,此時可以使用?,?表示未知通配符。 此時只能接受數(shù)據(jù),不能往該集合中存儲數(shù)據(jù)。
public class Demo1 {
public static void main(String[] args) {
// 使用多態(tài)方式 創(chuàng)建對象
Collection<Integer> list1 = new ArrayList<>();
list1.add(10);
Collection<String> list2 = new ArrayList<>();
list2.add("10");
}
public static void getElement(Collection<?> coll){}
}
通配符高級使用----受限泛型
之前設(shè)置泛型的時候,實(shí)際上是可以任意設(shè)置的,只要是類就可以設(shè)置。但是在JAVA的泛型中可以指定一個 泛型的上限和下限。
泛型的上限:
格式: 類型名稱 <? extends 類 > 對象名稱
意義:只能接收該類型及其子類
泛型得下限:
格式:類型名稱 <? super 類 > 對象名稱
意義:只能接收該類型及其父類型
public class Demo1 {
public static void main(String[] args) {
Collection<Integer> list1 = new ArrayList<Integer>();
Collection<String> list2 = new ArrayList<String>();
Collection<Number> list3 = new ArrayList<Number>();
Collection<Object> list4 = new ArrayList<Object>();
getElement1(list1);
getElement1(list2);//error
getElement1(list3);
getElement1(list4);//error
getElement2(list1);//error
getElement2(list2);//error
getElement2(list3);
getElement2(list4);
}
// 泛型的上限:此時的泛型?,必須是Number類型或者Number類型的子類
public static void getElement1(Collection<? extends Number> coll) {
}
// 泛型的下限:此時的泛型?,必須是Number類型或者Number類型的父類
public static void getElement2(Collection<? super Number> coll) {
}
}