Java基礎01-集合1、泛型
- 2019 年 11 月 5 日
- 筆記
第一章:集合1
1. 什麼是集合
-
定義:在Java中,集合是一種可以存儲多個數據的容器。
-
程式碼:
1 ArrayList<String> list = new ArrayList<>(); 2 list.add("張三"); 3 list.add("王五"); 4 list.add("趙六"); 5 System.out.println(list); // [張三, 王五, 趙六]
2. 集合和數組的區別
-
區別:數組的長度是固定的,集合的長度是可變的。
-
程式碼:
1 String[]strs = new String[2]; 2 strs[0] = "張三"; 3 strs[1] = "李四"; 4 // strs[2] = "趙六"; // 運行時報錯java.lang.ArrayIndexOutOfBoundsException 5 6 ArrayList<String> list = new ArrayList<>(); 7 System.out.println(list.size()); // 0 8 list.add("張三"); 9 list.add("王五"); 10 list.add("趙六"); 11 System.out.println(list.size()); // 3
3. 集合框架Collection
-
集合按照其存儲結構可以分為兩大類,本篇先學習Collection
-
Collection集合介紹
-
單列集合類的根介面
-
有兩個子介面
-
java.util.List;特點是:內容可重複,有序
-
java.util.Set; 特點是:內容不可重複,無序
-
-
定義了單例集合最共性的方法。
-
-
圖解Collection框架結構
-
Collection中通用方法
-
方法:
-
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()
: 把集合中的元素,存儲到數組中。
-
-
程式碼:
List<String> list = new ArrayList<>(); // 添加元素 list.add("張三"); list.add("李四"); System.out.println(list); // 移除元素 list.remove("張三"); System.out.println(list); // 判斷集合中是否包含某個元素 boolean isHas = list.contains("張三"); System.out.println(isHas); // false // 判斷當前集合是否為空 boolean isEmpty = list.isEmpty(); System.out.println(isEmpty); // 清空元素 list.clear(); System.out.println(list); // 集合的長度 System.out.println(list.size()); // 集合中的元素存儲到一個數組中 Object[]s = list.toArray();
-
4. 遍歷集合
-
Iterator方式
-
介紹
Iterator,是一個迭代器介面。Collection中的成員方法iterator()被調用後,會返回一個Iterator對象。利用這個對象可以實現遍歷集合。
如何遍歷呢?在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續在判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。這種取出方式專業術語稱為迭代。
-
Iterator對象的成員方法:
-
hasNext(); 檢測集合中是否存在下一個元素
-
next(); 找到並獲取下一個元素
-
-
迭代器的原理
在調用Iterator的next方法之前,迭代器的索引位於第一個元素之前,不指向任何元素,當第一次調用迭代器的next方法後,迭代器的索引會向後移動一位,指向第一個元素並將該元素返回,當再次調用next方法時,迭代器的索引會指向第二個元素並將該元素返回,依此類推,直到hasNext方法返回false,表示到達了集合的末尾,終止對元素的遍歷。
-
程式碼:
1 List<String> list = new ArrayList<>(); 2 list.add("張三"); 3 list.add("李四"); 4 list.add("王五"); 5 // 得到一個迭代器對象 6 Iterator<String> it = list.iterator(); 7 while (it.hasNext()) { 8 String str = it.next(); 9 System.out.println(str); 10 }
-
-
增強for
-
介紹
增強for循環(也稱for each循環)是JDK1.5以後出來的一個高級for循環,專門用來遍曆數組和集合的。它的內部原理其實是個Iterator迭代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。
-
使用格式
for(元素的數據類型 變數 : Collection集合or數組){
//寫操作程式碼
} -
程式碼:
for (String name:list) {
System.out.println(name);
}
-
第二章:泛型
1. 什麼是泛型
泛型,未知的類型,可以在類或方法中預支地使用未知的類型。
2. 泛型的好處
可以避免類型轉換的麻煩。
3. 定義和使用含有泛型的類
-
格式:
修飾符 class 類名<代表泛型的變數> { }
-
使用泛型:在創建對象的使用。也就是在創建對象時確定泛型的類型。
-
程式碼:
1 2 public class ArrayList<E> { 3 public boolean add(E e){ } 4 ... 5 } 6 7 public class MainDemo{ 8 public static void main(String[] args) { 9 ArrayList<String> list = new ArrayList<>(); 10 list.add("張三"); 11 } 12 }
4. 定義和使用含有泛型的方法
-
格式:
修飾符 <代表泛型的變數> 返回值類型 方法名(參數){ }
-
程式碼:
1 2 public static void main(String[] args) { 3 methon1("張三"); 4 } 5 public static <M> void methon1(M m){ 6 System.out.println(m); 7 }
5. 定義和使用含有泛型的介面
-
格式:
修飾符 interface介面名<代表泛型的變數>
-
程式碼:
1 2 public interface TestInterface<T> { 3 public abstract void show(T t); 4 } 5 6 public class<T> TestImpl implements TestInterface<T> { 7 @Override 8 public T void show(T o) { 9 System.out.println(o); 10 } 11 } 12 13 public class Main01 { 14 public static void main(String[] args) { 15 TestImpl<String> t = new TestImpl<>(); 16 t.show("我的資訊"); 17 18 } 19 20 }
6. 泛型通配符
-
介紹
不知道使用什麼類型來接收的時候,此時可以使用?,?表示未知通配符。
此時只能接受數據,不能往該集合中存儲數據。
-
程式碼:
1 public static void main(String[] args) { 2 ArrayList<String> list1 = new ArrayList<>(); 3 list1.add("張三"); 4 list1.add("李四"); 5 ArrayList<Integer> list2 = new ArrayList<>(); 6 list2.add(1); 7 list2.add(2); 8 print(list1); 9 print(list2); 10 } 11 // 定義一個方法列印集合,不確定未來集合中的元素類型,<>中不能寫入Object中,因為泛型中不存在繼承關係。 12 public static void print(ArrayList<?> list){ 13 System.out.println(list); 14 }
7. 泛型通配符受限使用
-
受限1:
類型名稱 <? extends 類 > 對象名稱
-
只能接收該類型或該類型的子類
-
-
受限2:
類型名稱 <? super 類 > 對象名稱
-
只能接收該類型或該類型的父類
-
-
程式碼:
1 public static void main(String[] args) { 2 Collection<Integer> list1 = new ArrayList<Integer>(); 3 Collection<String> list2 = new ArrayList<String>(); 4 Collection<Number> list3 = new ArrayList<Number>(); 5 Collection<Object> list4 = new ArrayList<Object>(); 6 7 getElement(list1); 8 getElement(list2);//報錯 9 getElement(list3); 10 getElement(list4);//報錯 11 12 getElement2(list1);//報錯 13 getElement2(list2);//報錯 14 getElement2(list3); 15 getElement2(list4); 16 17 } 18 // 泛型的上限:此時的泛型?,必須是Number類型或者Number類型的子類 19 public static void getElement1(Collection<? extends Number> coll){} 20 // 泛型的下限:此時的泛型?,必須是Number類型或者Number類型的父類 21 public static void getElement2(Collection<? super Number> coll){}
第三章:綜合案例鬥地主
-
需求:
-
實現發牌功能,並且展示底牌。
-
-
程式碼:
1 package it.leilei.cn.demo05; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.Collections; 6 7 public class Main01 { 8 public static void main(String[] args) { 9 // 1. 準備牌 10 // 牌的花色 11 String[]colors = {"♥","♠","♣","♦"}; 12 // 牌的數字 13 String[]nums = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"}; 14 // 2. 組裝裝牌 15 ArrayList<String> poker = new ArrayList<>(); 16 for (String num:nums) { 17 for (String color:colors) { 18 poker.add(num + color); 19 } 20 } 21 poker.add("大王"); 22 poker.add("小王"); 23 24 // 3. 發牌 25 ArrayList<String> list1 = new ArrayList<>(); 26 ArrayList<String> list2 = new ArrayList<>(); 27 ArrayList<String> list3 = new ArrayList<>(); 28 ArrayList<String> diPai = new ArrayList<>(); 29 30 // 打亂牌 31 Collections.shuffle(poker); 32 33 for (int i = 0,len = poker.size(); i < len;i++) { 34 if(i>=51) { 35 diPai.add(poker.get(i)); 36 }else if(i%3==0) { 37 list1.add(poker.get(i)); 38 }else if(i%3==1) { 39 list2.add(poker.get(i)); 40 }else if(i%3==2) { 41 list3.add(poker.get(i)); 42 } 43 } 44 45 System.out.println("周星馳:" + list1); 46 System.out.println("劉德華:" + list2); 47 System.out.println("周潤發:" + list3); 48 System.out.println("底牌:" + diPai); 49 50 } 51 }