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   }