1. 程式人生 > >Java基礎01-集合1、泛型

Java基礎01-集合1、泛型

集合、泛型

第一章:集合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   }