文章目錄
一、集合概述
1. 集合是什麼
集合: 集合是java中提供的一種容器,可以用來存儲多個數據。
- 數組的長度是固定的。集合的長度是可變的。
- 數組中存儲的是同一類型的元素,可以存儲基本數據類型值。集合存儲的都是對象。而且對象的類型可以不一致。在開發中一般當對象多的時候,使用集合進行存儲。
2. 集合的學習
學習目標:
- 學會用集合存儲數據
- 學會取出集合中數據(遍歷)
- 掌握每種集合的特性
學習方法:
- 學習頂層: 學習接口特性,學習共性內容
- 使用底層: 使用集合類創建的對象
單列集合間的關係: 單列集合間有繼承關係
二、Collection接口
1. 單列集合常用方法
爲了試驗這些方法,我們一個使用接口對象?但是接口能創建對象嘛?所以,我們應該採取多態寫法。
三、Iterator接口
Iterator接口
也稱爲迭代器
迭代: 是Collection
中通用的取出元素的方式。先判斷集合中,有無元素,有則取出。取出後再判斷。一直到取出集合中所有元素爲止。
1. Iterator創建
Iterator
是一個抽象類,在Collection
中有一個方法,可以返回Iterator
的實現類對象
注意: 迭代器的接口也是有泛型的,跟集合一致
2. Iterator方法
- 通過
hashNext()
方法判斷,是否仍有元素可以迭代 - 當可以迭代時,通過
next()
方法取出
3. Iterator內存圖
-
初始
-
創建迭代器對象。迭代器對象中保存了一個指針(索引),指向集合的-1索引處。
-
hasNext()方法判斷,下一個索引處,有無元素
-
next()方法,做了兩件事:
1. 取出下一個索引處的元素
2. 索引+1
4. 增強for
4.1 foreach是什麼
增強for循環(也稱for each循環): 從JDK1.5開始,有一個高級for循環,專門用來遍歷數組和集合的。它的內部原理其實是個Iterator迭代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。
說明: 其實底層是迭代器,只是套了個for循環的殼,來簡化遍歷書寫
Collection
實現了Iterable接口
Iterable接口
具有如下說明:
4.2 foreach實現
for(集合/數組類型 元素變量名:集合/數組名) {
// 要進行的操作
}
四、泛型
1. 泛型是什麼
泛型: 是一種未知的數據類型,當我們不知道使用說明數據類型時,可以使用泛型。
泛型也可以看做是一個變量,用來接收數據類型
比如:
E e : Element 元素
T t : Type 類型
在創建對象的時候,泛型的數據類型纔得到確定。比如,下面表示:E = String;
2. 使用泛型的好處
不使用泛型的好處:
- 優點: 默認Object類型。可以存儲任何類型數據
- 缺點: 不安全,會引發異常
使用泛型的好處:
- 避免了類型轉換的麻煩,存入的是什麼類型,取出的就是什麼類型。(如果不使用,把String類型的數據存入,會變爲Object。如果要使用String方法,需要向下轉型。)
- 把運行期異常(代碼運行後),提升到了編譯期。(如果要使用String方法,可是存入的是其它比如int類型的數據,會報錯。而如果)
3. 定義泛型的類
- 在類名後,加上
<E>
(也可以叫<M>
或其它,只要一致就可) - 把需要使用泛型的數據類型,替換爲E
4. 定義泛型的方法
格式:
修飾符 泛型 返回值類型 方法名(泛型 變量名) {}
特點是,傳遞什麼類型,泛型就是什麼類型
5. 定義泛型的接口
定義如下含有泛型的接口:
含有泛型的接口,有兩種實現方式
5.1 實現方式(一)
實現類,直接指定接口的泛型。(比如Scanner指定了泛型爲String)
5.2 實現方式(二)
實現類,和接口使用一致的泛型
6. 泛型通配符
6.1 泛型通配符的使用
泛型通配符: ?
代表任意的數據類型
- 特點: 不能創建對象使用,只能作爲方法的參數使用
怎樣定義一個方法,能夠遍歷這兩個集合呢?答,使用通配符作爲參數類型。
6.2 泛型通配符的上下限
- 泛型的上限限定:
? extends E
,使用的泛型只能是E本身 或其子類 - 泛型的下限限定:
? super E
,使用的泛型只能是E本身 或其父類
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>();
getElement(list1);
getElement(list2);//報錯
getElement(list3);
getElement(list4);//報錯
getElement2(list1);//報錯
getElement2(list2);//報錯
getElement2(list3);
getElement2(list4);
}
// 泛型的上限:此時的泛型?,必須是Number類型或者Number類型的子類
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此時的泛型?,必須是Number類型或者Number類型的父類
public static void getElement2(Collection<? super Number> coll){}
五、鬥地主(單列)
1. 需求&分析
需求: 完成洗牌發排的動作
- 產生牌:可以使用循環+集合
- 手牌:每個玩家都是一個集合,最後三張牌直接作爲底牌
- 洗牌:使用
Collections
的shuffle
方法(Collections
是操作集合的工具類,有許多靜態方法) - 發牌:發給各個玩家
- 展示:展示牌
2. 主運行文件
按照需求,編寫主運行文件