1. 程式人生 > 其它 >Java集合框架(二)泛型

Java集合框架(二)泛型

Java集合框架(二)泛型

泛型

什麼是泛型

  • 引數化型別:將型別作為引數傳遞

泛型的常見形式

  • 泛型類
  • 泛型介面
  • 泛型方法

泛型的語法

  • <T,........> 其中T稱為型別佔位符(在實際使用的時候這裡會填入型別),它表示一種引用型別

程式碼例項

泛型類
  • 類名<T,T...>

  • T表示引用型別,不能是基礎型別,如果表示多個引用型別則用逗號隔開

  • 泛型不能用new例項化,因為不能保證

  • 舉例1:

    泛型類:

    public class Room<T> {
        //T代表一種資料型別,在使用的時候為T賦值(使用的時候再決定T做什麼資料型別)
        //使用泛型T
        //建立變數
        T t;
        //新增方法
        public void show(T t){
            System.out.println(t);
        }
        //泛型作為方法的返回值
        public T getT(){
            return t;
        }
    }
    

    使用泛型類

    主函式:

    public class Demo07 {
        public static void main(String[] args) {
            //使用泛型類建立物件
            Room<String> room = new Room<>();
            //將佔位符T命為String,則Room類裡面的T代表String型別
            //所以t是String型別
            room.t = "史小鵬";
            System.out.println(room.getT());
        }
    }
    //輸出:
    史小鵬
    
  • 舉例2:

    泛型類:

    public class Room2<A,B>{
        A s1;
        B s2;
        public A getS1(){
            return s1;
        }
        public B getS2(){
            return s2;
        }
    }
    

    使用泛型類

    主函式:

    public class Demo08{
        public static void main(String[] args) {
            //使用泛型類建立物件
            //<>裡只能寫引用物件,不能寫基礎物件,例如int是基礎物件所以不能寫
            /*
            1、Integer是int的包裝類,int則是java的一種基本資料型別
            2、Integer變數必須例項化後才能使用,而int變數不需要
            3、Integer實際是物件的引用,當new一個Integer時,實際上是生成一個指標指向此物件;而int則是直接儲存資料值
            */
            Room2<String, Integer> room2 = new Room2<>();
            room2.s1="史小鵬";
            room2.s2=18;
            System.out.println(room2.getS1()+":"+room2.getS2());
        }
    }
    //輸出:
    史小鵬:18
    
泛型介面
  • 由於介面不能例項,所以介面沒有例項變數,預設都是常量(必須賦值)

  • 由於T(泛型)不能例項化,所以沒有泛型常量,不能直接賦初值

  • 舉例1(實現類裡指明T的泛型型別):

    泛型介面:

    public interface Room3<T> {
        String name = "史小鵬";
        T server(T t);//方法
    }
    

    實現類:

    //介面Room3的實現類
    public class Room3_1 implements Room3<String>{
        String t;
        public String server(String t){
            this.t=t+"242";
            return this.t;
        }
    }
    

    主函式:

    public class Demo09 {
        public static void main(String[] args) {
            Room3_1 room3_1 = new Room3_1();
            System.out.println(room3_1.name);
            //使用實現類的方法
            System.out.println(room3_1.server("工作"));
        }
    }
    //輸出:
    史小鵬
    工作242
    
  • 舉例2(實現類也是泛型類,不指明T泛型型別):

    泛型介面:

    public interface Room3<T> {
        String name = "史小鵬";
        T server(T t);//方法
    }
    

    實現類:

    //介面Room3的實現類
    //泛型類的型別是什麼,則泛型介面的型別就是什麼
    public class Room3_1<T> implements Room3<T>{
        public T server(T t){
            return t;
        }
    }
    

    主函式:

    public class Demo09 {
        public static void main(String[] args) {
            Room3_1<String> room3_1 = new Room3_1<>();
            System.out.println(room3_1.server("sxp史小鵬"));
        }
    }
    //輸出:
    sxp史小鵬
    
泛型方法
  • 方法中的型別不用傳遞,它會根據你所傳入的資料自動判斷型別

  • 舉例:

    泛型方法:

    public class Room4 {
        public <T> void show(T t){
            System.out.println("泛型方法"+t);
        }
        public <A> A show2(A a){
            return a;
        }
    }
    

    主函式:

    //呼叫泛型方法
    public class Demo10 {
        public static void main(String[] args) {
            Room4 room4 = new Room4();
            //型別不用傳遞,它會根據你所傳入的資料自動判斷型別
            room4.show("abc");
            System.out.println(room4.show2(200));
        }
    }
    //輸出:
    泛型方法abc
    200
    

泛型的好處

  • 提高程式碼的重用性
  • 防止型別轉換異常,提高程式碼的安全性

泛型與集合框架

  • 集合框架中是帶有泛型的,不使用泛型的話預設是Object型別,但會導致其中的資料元素都是Object型別

  • 舉例1:

    public class Demo11 {
        public static void main(String[] args) {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(10);
            list.add(20);
            System.out.println(list.get(0)+list.get(1));
        }
    }
    //輸出:
    30
    
  • 舉例2:

    學生類:

    public class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        //重寫toString方法
        public String toString(){
            return this.name+" "+this.age;
        }
    }
    

    主函式:

    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class Demo12 {
        public static void main(String[] args) {
            ArrayList<Student> arrayList = new ArrayList<>();
            Student s1 = new Student("張三",18);
            Student s2 = new Student("李四",19);
            Student s3 = new Student("王五",20);
            Student s4 = new Student("趙六",21);
            //新增元素
            arrayList.add(s1);
            arrayList.add(s2);
            arrayList.add(s3);
            arrayList.add(s4);
            Iterator iterator = arrayList.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }
    }
    //輸出:
    張三 18
    李四 19
    王五 20
    趙六 21