1. 程式人生 > >Collection,泛型,Map

Collection,泛型,Map

1.Collection集合

集合和陣列的區別?

  • 陣列的長度是固定的, 集合的長度是可變的
  • 陣列中儲存的資料都是同一型別的資料。集合儲存的是物件,而且物件的型別可以不一致

集合框架

單列集合

java.util.Collection

Collection:單列集合的跟介面,用於儲存一系列的規則的元素

兩個子介面:

  • java.util.List: List中元素是有序,元素可重複
    • 實現類:java.util.ArrayList, java.util.LinkedList
  • Java.util.Set: Set中元素無序,不重複
    • 實現類:java.util.HashSet, java.util.TreeSet

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():把集合的元素儲存到陣列中

    import java.util.ArrayList;
    import java.util.Colleaction;
    
    public class Demo{
      public static void main(String[] args){
        // 建立集合物件,使用多型
        Collection<String> coll new ArrayList<String>();
        //使用方法
        // 新增
        coll.add("楊冪").add("劉亦菲").add("唐嫣").add("胡珺");
        System.out.println(coll);
        // 判斷是否在集合中
        System.out.println("判斷胡珺是否在集合中"+coll.contains("胡珺"));
        // 判斷集合是否為空
        System.out.println(coll.isEmpty());
        // 集合中有多少個元素
        System.out.println(coll.sixe());
        // 刪除指定的元素
        coll.remove("胡珺");
        // 集合儲存到陣列中
        Object[] object = coll.toArray();
        //遍歷陣列
        for(int i=0;i<object.length;i++){
          System.out.println(i);
        }
        // 清空集合
        coll.clean();
      }
    }

2.Iterator迭代器

迭代

  • 在集合中獲取元素之前進行判斷集合中有沒有元素,如果有取出來,繼續進行判斷,繼續取出來,知道集合元素全部取出

Iterator的常用方法

  • public E next():返回迭代的下一個元素
  • public boolean hasNext():如果有元素可以迭代,則返回True
public class Demo{
  public static void main(String[] args){
    //使用多肽建立集合
    Collection<String> coll = new ArrayList<String>();
    // 新增元素
    coll.add("楊冪").add("胡珺").add("程銳");
    //使用迭代器進行遍歷
    Iterator<String> it = coll.iterator();
    // 泛型值得是: 迭代出來的資料型別
    while(it.hasNext()){//判斷是否有迭代元素
      String s = it.next(); //獲取迭代的元素
      System.out.println(s);
    }
  }
}

增強for

格式:

for(元素的資料型別 變數:Collection集合或者陣列){
  //操作程式碼
}

它用於變數Collection和陣列, 不要在遍歷的時候對集合元素進行曾刪操作

public class Demo{
  public static void main(String[] args){
    int[] arr = {1,2,3,4,5};
    for(int i:arr){
      System.out.println(i);
    }
  }
}
public class Demo{
  public static void main(String[] args){
    Collection<String> coll = new ArrayList<String>();
    coll.add("112");
    coll.add("113");
    coll.add("114");
    for(String s:coll){
      System.out.println(s);
    }
  }
}

只針對Collection和陣列, 用於遍歷

3.泛型

在從集合中存取資料,資料將被提升為Object型別,當我們取出一個的物件,進行操作,這個時候需要型別轉換

  • 泛型:可以再類或者是方法中預支的使用未知的資料型別

    一般在建立物件是,當沒有指定型別的時候,預設是Object型別

泛型好處

  • 將執行售後的ClassCastException,轉移到了編譯時期變成編譯失敗
  • 避免了型別強轉的麻煩
public class Demo{
  public static void main(String[] args){
    collection<String> coll = new ArrayList<String>();
    coll.add("abd");
    coll.add("aaa");
    //coll.add(5); 當集合明確型別後, 存放型別不一致就會編譯錯誤
    // 集合已經明確的具體存放的元素型別,那麼在使用迭代器的時候,迭代器也同樣知道具體遍歷元素型別
    Iterator<String> it = coll.iterator();
    while(it.hasNext()){
      //當使用Iterator控制的元素型別之後,就不要強轉了,獲取的元素就是String型別
      String str = it.next();
      System.out.println(str);
    }
  }
}

泛型是資料泛型的一部分,我們將類名和泛型合併起來一起看做資料型別

泛型的定義與使用

我們在集合中通常使用到了泛型

泛型,用來靈活的將資料型別應用到不同的類,方法,介面當中。將資料型別作為引數進行傳遞

定義和使用含有泛型的類

定義格式:

修飾符 class 類名<代表泛型的變數>{}

demo

ArrayList集合;
public class ArrayList<E>{
  public boolean add(E e){}
  public E get(int index){}
  ....
}

使用泛型:即什麼時候確定泛型

在建立物件的時候使用泛型

例如:ArrayList

此時就可以理解變數E的值就是String型別,那麼理解為

public class ArrayList<String>{
  public boolean add(String e){}
  public String get(int index){}
}

再例如,ArrayList

此時理解為E的值就是Integer

public class ArrayList<Integer>{
  public boolean add(Integer e){}
  public Integer get(int index){}
}

demo

public class MyGenericClass<MVP>{
  //沒有MVP型別,在這裡帶變得是一種未知型別, 傳遞什麼型別就是什麼型別
  private MVP mvp;
  public void setMVP(MVP mvp){
    this.mvp = mvp;
  }
  public MVP getMVP(){
    return mvp;
  }
}

使用

public class GenericClassDemo{
  public static main(String[] args){
    // 建立一個泛型為Integer的類
    MyGenericClass<Integer> myNum = new MyGenericClass<Integer>();
    myNum.setMVP(124);
    Integer mvpNum = myNum.getMVP();
    System.out.println(mvpNum);
    
    //建立一個泛型為String的類
    MyGenericClass<String> myStr = new MyGenericClass<String>();
    myNum.setMVP("哈哈");
    String mvpStr = myStr.getMVP();
    System.out.println(mvpStr);
  }
}
含有泛型的方法

定義格式:

修飾符 <代表泛型的變數> 返回值型別 方法名(引數){}

例如

public class MyGenericMethod{
  public <MVP> void show(MVP mvp){
    System.out.println(mvp.getClass());
  }
  public <MVP> MVP show2(MVP mvp){
    return mvp;
  }
}

使用格式: 呼叫方法時,確定泛型的型別

public class GenericMethodDemo{
  public static void main(String[] args){
    //建立物件
    MyGenericMethod mm = new MyGenericMethod();
    //演示看方法提示
    mm.show("aaa");
    mm.show(12);
  }
}
含有泛型的介面

定義格式:

修飾符 Interface介面名 <代表泛型的變數>{}

例如

public interface MyGenericInterFace<E>{
  public abstract void add(E e);
  public abstract E getE();
}

使用格式:

1.定義類是確定泛型的型別

例如

public class MyImpl implements MyGenericInterFace<String>{
  @Override
  public void add(String e){
    //...
  }
  @Override
  public void getE(){
    return null;
  }
}
//此時泛型E的值就是String型別
2.始終不確定泛型的型別,直接建立物件時,確定泛型的型別

例如

public class MyImpl<E> implements MyGenericInterFace<E>{
  @Override
  public void add(E e){
    //...
  }
  @Override
  public void getE(){
    return null;
  }
}

確定泛型:

public class GenericInterFace{
  public static void main(String[] args){
    MyImpl<String> my = new MyImpl<String>();
    my.add("aaa");
  }
}

泛型萬用字元

當我們使用泛型或者是介面的時候,傳遞的資料中,泛型型別不確定,可以通過萬用字元<?>表示,但是一旦使用泛型的萬用字元之後,只能使用Object類中的共性方法,集合中元素自身的方法無法使用。

萬用字元的基本使用

泛型的萬用字元:不知道使用什麼型別來接收的時候,此時可以使用??表示未知萬用字元

此時只接受資料,不能再集合中儲存資料

例子:

public class Demo{
  public static void main(String[] args){
    Collection<Integer> list1 = new ArrayList<Integer>();
    getElement(list1);
    Collection<String> list2 = new ArrayList<String>();
    getElement(list2);
    }
  public static void getElement(Collection<?> coll){
    // ? 代表可以接受任意型別
  }
}

泛型不存在繼承關係,Collection