Java語言進階 #集合 #Day13 #Collection #Iterator迭代器 #泛型 #鬥地主(單列)

一、集合概述

1. 集合是什麼

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

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

2. 集合的學習

學習目標:

  1. 學會用集合存儲數據
  2. 學會取出集合中數據(遍歷)
  3. 掌握每種集合的特性

學習方法:

  • 學習頂層: 學習接口特性,學習共性內容
  • 使用底層: 使用集合類創建的對象

單列集合間的關係: 單列集合間有繼承關係
在這裏插入圖片描述

二、Collection接口

1. 單列集合常用方法

在這裏插入圖片描述
爲了試驗這些方法,我們一個使用接口對象?但是接口能創建對象嘛?所以,我們應該採取多態寫法。


在這裏插入圖片描述

三、Iterator接口

Iterator接口也稱爲迭代器
迭代:Collection中通用的取出元素的方式。先判斷集合中,有無元素,有則取出。取出後再判斷。一直到取出集合中所有元素爲止。

1. Iterator創建

Iterator是一個抽象類,在Collection中有一個方法,可以返回Iterator的實現類對象
在這裏插入圖片描述
在這裏插入圖片描述

注意: 迭代器的接口也是有泛型的,跟集合一致

2. Iterator方法

在這裏插入圖片描述

  1. 通過hashNext()方法判斷,是否仍有元素可以迭代
  2. 當可以迭代時,通過next()方法取出

在這裏插入圖片描述

3. Iterator內存圖

  1. 初始
    在這裏插入圖片描述

  2. 創建迭代器對象。迭代器對象中保存了一個指針(索引),指向集合的-1索引處。
    在這裏插入圖片描述

  3. hasNext()方法判斷,下一個索引處,有無元素

  4. 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類型。可以存儲任何類型數據
  • 缺點: 不安全,會引發異常

使用泛型的好處:

  1. 避免了類型轉換的麻煩,存入的是什麼類型,取出的就是什麼類型。(如果不使用,把String類型的數據存入,會變爲Object。如果要使用String方法,需要向下轉型。)
  2. 把運行期異常(代碼運行後),提升到了編譯期。(如果要使用String方法,可是存入的是其它比如int類型的數據,會報錯。而如果)

3. 定義泛型的類

  1. 在類名後,加上<E>(也可以叫<M>或其它,只要一致就可)
  2. 把需要使用泛型的數據類型,替換爲E
    在這裏插入圖片描述

在這裏插入圖片描述

4. 定義泛型的方法

格式:

修飾符 泛型 返回值類型 方法名(泛型 變量名) {}

特點是,傳遞什麼類型,泛型就是什麼類型
在這裏插入圖片描述
在這裏插入圖片描述

5. 定義泛型的接口

定義如下含有泛型的接口:
在這裏插入圖片描述
含有泛型的接口,有兩種實現方式

5.1 實現方式(一)

實現類,直接指定接口的泛型。(比如Scanner指定了泛型爲String)
在這裏插入圖片描述
在這裏插入圖片描述

5.2 實現方式(二)

實現類,和接口使用一致的泛型
在這裏插入圖片描述
在這裏插入圖片描述

6. 泛型通配符

6.1 泛型通配符的使用

泛型通配符: ?代表任意的數據類型

  • 特點: 不能創建對象使用,只能作爲方法的參數使用
    在這裏插入圖片描述
    怎樣定義一個方法,能夠遍歷這兩個集合呢?答,使用通配符作爲參數類型。
    在這裏插入圖片描述

6.2 泛型通配符的上下限

  • 泛型的上限限定: ? extends E ,使用的泛型只能是E本身 或其子類
  • 泛型的下限限定: ? super E ,使用的泛型只能是E本身 或其父類

Object類
String 類
Number類
Integer類
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. 需求&分析

需求: 完成洗牌發排的動作

  1. 產生牌:可以使用循環+集合
  2. 手牌:每個玩家都是一個集合,最後三張牌直接作爲底牌
  3. 洗牌:使用Collectionsshuffle方法(Collections是操作集合的工具類,有許多靜態方法)
  4. 發牌:發給各個玩家
  5. 展示:展示牌

2. 主運行文件

按照需求,編寫主運行文件
在這裏插入圖片描述

3. 編寫生成撲克牌組文件

在這裏插入圖片描述

4. 定義玩家

在這裏插入圖片描述

5. 定義發牌文件

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章