1. 程式人生 > >Java泛型( 表示集合中儲存的資料的型別)

Java泛型( 表示集合中儲存的資料的型別)

1.儲存字串

//建立一個集合儲存abcd
    //<E>就代表儲存元素資料的型別
    //後面的<> 要跟前面的泛型保持一致
    //jdk1.7出來的 菱形泛型
    //如果前面聲明瞭泛型,後面的泛型可以省略不寫,省略不寫,就表示型別一致

    ArrayList<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    //用迭代器遍歷
    Iterator<String
>iterator = list.iterator(); while(iterator.hasNext()) { //新增泛型之後,可以省去強轉的麻煩 String next = iterator.next(); System.out.println(next); } } }

2.泛型編譯期與執行期

public static void fun2() {
    //建立集合,儲存三個學生
    ArrayList<Student> list = new ArrayList<>();
    list
.add(new Student("鵬鵬", 11)); list.add(new Student("水水", 12)); list.add(new Student("倩倩", 13)); Iterator<Student> iterator = list.iterator(); while(iterator.hasNext()) { Student next = iterator.next(); System.out.println(next); //編譯通過 是這個型別 你才能強轉 執行報錯 //設定泛型 可以把執行期報錯 轉換到編譯期報錯
// Worker worker = (Worker)next; } }

3.泛型類

package com.lanou3g.fx;
/*
 * 泛型類(泛型類宣告時 尖括號中的字母 可以隨便定義)
 * 泛型類的型別 在初始化這個類的物件的時候 確定
 */
public class Worker <W>  {
    //利用泛型寫成員方法
    private W w ;
    //利用泛型寫set/get方法
    public void setM(W w) {
        this.w = w;
    }
    public W getM() {
        return w;
    }
    //普通成員方法
    public void sayHi( W w) {
        System.out.println(w);
    }
    //除了W 還能不能使用其他的泛型 例如 Z
    //宣告不同泛型的方法,在呼叫泛型方法的時候,
    //指定泛型方法的型別
    //宣告一個泛型, 只能宣告過得,才能使用
    public <Z> void print(Z z) {
        System.out.println(z);
    }

    //靜態方法中,能不能直接使用W---不能直接使用
    //當你呼叫靜態方法的時候,可能還沒有物件,
    //沒有物件就沒指定泛型,所以不能用
    //呼叫的時候確定型別
    public static <Q> void fun(Q q) {
        System.out.println(q);
    }
  //工作的方法
    public void work() {
        System.out.println("天天搬磚 一天能搬四百塊磚");
    }
}


public static void fun3() {
    //建立泛型類
    Worker<String> worker = new Worker<>();
    //給屬性賦值
    worker.setM("呀哈哈");
    System.out.println(worker.getM());
    worker.sayHi("hahha");
    //呼叫方法的時候給定型別
    worker.print("你好");
    //呼叫靜態方法
    Worker.fun("好好");
}

4.介面泛型

//實現類的時候給定型別
 interface InterA <Y>{
       public abstract void fun(Y y);

 }
class InterAImple implements InterA<String>{

    @Override
    public void fun(String y) {
        // TODO Auto-generated method stub
        System.out.println(y);
    }

}

5.向上限定和向下限定

package com.lanou3g.fx;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.lanou3g.bean.Person;
import com.lanou3g.bean.Student;

/*
 * ?extends E (向下限定)
 * 
 * ?是子類 E是父類  ?只能是E類的子類
 * ?super E
 * ?是父類 E是子類 (向上限定)  ?只能是E類的父類  
 */
public class Demo02 {
 public static void main(String[] args) {
    //fun1();
     //呼叫一:直接傳陣列
    /* int [] array = {1,3,5,7,9};
     fun2(10,array);
    //呼叫二:傳入多個數
     fun2(1,3,5,7,9);
     */
     //Arrays 類方法 把陣列轉化為集合
     int [] array = {1,2,3,4,5};
     //把陣列當做集合中的一個元素,轉為了一個集合
     List<int[]> asList = Arrays.asList(array);
     //
      Integer [] array2 = {1,2,3,4,5};//自動裝箱為Integer型別
      List<Integer> asList2 = Arrays.asList(array2);
      System.out.println(asList2);
      System.out.println(asList);
      String [] array3 ={"wanglong","wangsong"};
      List<String> asList3 = Arrays.asList(array3);
      System.out.println(asList3);
      //把王建忠新增到 集合中
      //使用 asList 陣列轉集合  得到一個集合
      //注意:這個集合不允許,進行新增或刪除的操作
      //asList3.add("wangjianzhong");
      //System.out.println(asList3);
      //那這樣轉的意義何在?可以呼叫集合的其他方法
       boolean contains = asList3.contains("wanglong");
      System.out.println(contains);

}
 //int ... num 相當於傳入的引數是個陣列
 //int ...num 可以接受多個引數 只能是方法引數最後一個

 //jdk1.5之後出來的
  public static void fun2(int j,int ... num) {
      //遍歷
      for (int i = 0; i < num.length; i++) {
        System.out.println(num[i]);
    }
      System.out.println("int j+"+j);
  }
/**
 * 
 */
public static void fun1() {
    /*
     * 建立一個儲存人的集合 存兩人
     * 建立一個儲存學生的集合 存兩人
     */
     ArrayList<Person> pList = new ArrayList<>();
     pList.add(new Person("張三", 11));
     pList.add(new Person("李四", 11));
     ArrayList<Student>sList = new ArrayList<>();
     sList.add(new Student("鵬鵬", 12));
     sList.add(new Student("茜茜", 12));
     //pList.addAll(sList);
    // System.out.println(pList);
     //括號裡面只能填子類
    // sList.addAll(pList);
     //System.out.println(sList);
}
}

6.集合中的刪除方式


/*
 * )
 * 1.不使用迭代器
 * 2.使用迭代器
 */
public class Demo03 {
  public static void main(String[] args) {
    //fun1();
    //fun2();
    //建立集合 儲存 a,b,c,d,e
      ArrayList<String> list = new ArrayList<>();
      list.add("a");
      list.add("b");
      list.add("b");
      list.add("c");
      list.add("d");

      //增強for迴圈遍歷  底層是使用迭代器遍歷的
      //增強for迴圈 只能 用來遍歷 也叫快速遍歷
      //雙層遍歷的時候 使用比較多
      for (String string : list) {
        System.out.println(string);
    }
}

/**
 * 
 */
public static void fun2() {
    //建立集合 儲存 a,b,c,d,e
      ArrayList<String> list = new ArrayList<>();
      list.add("a");
      list.add("b");
      list.add("b");
      list.add("c");
      list.add("d");
      //迭代器刪除
      //如果集合中
      Iterator<String> iterator = list.iterator();
      while(iterator.hasNext()) {
          String next = iterator.next();
          if(next.equals("b")) {
              iterator.remove();
          }
      }
      System.out.println(list);
}

/**
 * 
 */
public static void fun1() {
    //建立集合 儲存 a,b,c,d,e
      //
      ArrayList<String> list = new ArrayList<>();
      list.add("a");
      list.add("b");
      list.add("b");
      list.add("c");
      list.add("d");

     //如果不使用迭代器遍歷
      //如果集合中有b就把b刪除了
      for (int i = 0; i < list.size(); i++) {
        if(list.get(i).equals("b")) {
            //先當引數傳進去,在自減
            list.remove(i); 
            i--;
        }   
    }System.out.println(list);
}
}

7.集合中的排序

public class Demo04 {
public static void main(String[] args) {
    //fun1();
      //建立一個集合,存入五個學生
        //按學生姓名進行排序
        ArrayList<Student>list = new ArrayList<>();
        list.add(new Student("a", 12));
        list.add(new Student("b", 14));
        list.add(new Student("c", 17));
        list.add(new Student("d", 13));
        list.add(new Student("e", 18));
        //呼叫方法
        sortByName(list);
        //列印集合列印排序好的
        System.out.println(list);
}
//按姓名比較 傳進來的是集合的地址
  public static void sortByName(ArrayList<Student>list){
      //比較交換
      for (int i = 0; i < list.size(); i++) {
            for (int j = 0; j < list.size()-1-i; j++) {
                //
                Student stu1 = list.get(j);
                Student stu2 = list.get(j+1);
                //比較學生姓名
                if(stu1.getName().compareTo(stu2.getName()) < 0) {
                    //交換(修改)在集合中的位置
                    Collections.swap(list, j, j+1);
                }
            }
        }
        System.out.println(list);
  }
/**
 * 
 */
public static void fun1() {
    //建立一個集合,存入五個學生
    //按學生年齡進行排序
    ArrayList<Student>list = new ArrayList<>();
    list.add(new Student("峰峰", 12));
    list.add(new Student("紅紅", 14));
    list.add(new Student("火火", 17));
    list.add(new Student("小小", 13));
    list.add(new Student("美美", 18));

    for (int i = 0; i < list.size(); i++) {
        for (int j = 0; j < list.size()-1-i; j++) {
            //
            Student stu1 = list.get(j);
            Student stu2 = list.get(j+1);
            //比較學生年齡
            if(stu1.getAge()>stu2.getAge()) {
                //交換(修改)在集合中的位置
                //set (int index,Object object)
                //Student temp = s1;
                list.set(j+1, stu1);
                list.set(j, stu2);

            }
        }
    }
    System.out.println(list);
}
}