天天看點

【Java學習】Collection集合、泛型

【Java學習】Collection集合、泛型

所有單列集合的最頂層的接口,裡面定義了是以單列集合共性的方法

任意的單列集合都可以使用Collection接口中的方法

共性方法:

public boolean add(E e): 把給定的對象添加到目前集合當中
	傳回值是一個boolean值,一般都傳回true,是以可以不用接收
    public void clear(): 清空集合當中是以的元素,但是不删除集合,集合還存在

    public boolean remove(E e): 把給定的對象在目前集合中删除
    傳回值是一個boolean值,集合中存在元素,删除元素,傳回true
	集合不存在元素,删除失敗,傳回false

    public boolean contains(E e): 判斷目前集合中是否包含給定的對象
                                包含傳回true,不包含傳回false
    public boolean isEmpty(): 判斷目前集合是否為空。
    public int size(): 傳回集合當中元素的個數
    public Object[] toArray(): 把集合當中的元素,存到數組中
           

Iterator接口

疊代器(對集合進行周遊)

常用的方法:

boolean hasNext() 如果有元素可以疊代,則傳回true

判斷集合中還有沒有下一個元素,有傳回true,沒有傳回false

E next() 傳回疊代的下一個元素

取出的集合的下一個元素

Iterator疊代器,是一個接口,我們無法直接使用,需要使用Iterator接口的實作類對象,擷取實作類的方式比較特殊

Collection 接口中有個方法,iterator(),這個方法傳回的就是疊代器的實作類對象

Iterator iterator() 傳回在此collection的元素上進行疊代的疊代器

疊代器的使用步驟:
    1.使用集合當中的方法iterator()擷取疊代器的實作類對象,使用Iterator接口接收(多态)
    2.使用Iterator接口中的方法hasNext判斷還有沒有下一個元素
    3.使用Iterator接口中的方法next取出集合中的下一個元素
           

疊代器取出集合中元素的代碼,是一個重複的過程

是以我們使用循環優化

不知道集合中有多少元素,使用while循環

循環結束條件,hanNext方法傳回false

public class Demo01Iterator {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();

        coll.add("姚明");
        coll.add("科比");
        coll.add("麥迪");
        coll.add("詹姆斯");
		Iterator<String> it = coll.iterator();
		while (it.hasNext()) {
		            String e = it.next();
		            System.out.println(e);
		        }
	}
}
           

增強for循環:底層使用的也是疊代器,使用for循環格式,簡化了疊代器的書寫

Collection<E>extends Iterable<E>:是以的單列集合都可以使用增強for

public interface Iterable<T>實作這個接口允許對象成為"foreach"語句的目标

格式:

for(集合的資料類型 變量名:集合名){
    ...
}
           
import java.util.ArrayList;

public class Demo02Foreach {
    public static void main(String[] args) {
        // 集合的周遊
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("aaa");
        arrayList.add("bbb");
        arrayList.add("ccc");
        for (String str: arrayList) {
            System.out.println(str);
        }


        // 數組的周遊
        int[] arr = {1, 2, 3, 4};
        for (int i : arr) {
            System.out.println(i);
        }
    }

}

           

泛型

package cn.sytest.day10.demo03;

import java.util.ArrayList;
import java.util.Iterator;

public class Demo01Generic {
    public static void main(String[] args) {

        show02();


    }
    /*
    建立集合對象,使用泛型
    好處:
        1.避免了類型轉換的麻煩,存儲的是什麼類型,取出的就是什麼類型
        2.把運作期異常(代碼運作之後會抛出的異常),提升到了編譯期(寫代碼的時候就會報錯)
    弊端:
        泛型是什麼類型,隻能存儲什麼類型的資料

     */

    private static void show02() {
        ArrayList<String> list = new ArrayList<>();
        list.add("abc");
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
    }

    /*
     建立集合對象,不使用泛型
            好處:
                集合不适用泛型,預設的類型就是Object類型,可以存儲任意類型的資料
            弊端:
                不安全,會引發異常
     */
    private static void show01() {
        ArrayList list = new ArrayList();
        list.add("abc");
        list.add(1);
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Object obj = it.next();
            System.out.println(obj);

            // ClassCastException
            String s = (String) obj;
            System.out.println(s.length());
        }
    }
}

           

定義了一個含有泛型的類,模拟ArrayList集合

泛型是一個未知的資料類型,當我們不确定什麼資料類型的時候,可以使用泛型

泛型可以接收任意資料的類型,可以使用Integer,String,Student

建立對象的時候确定泛型的資料類型

public class GenericClass<E> {
    private E name;

    public E getName() {
        return name;
    }

    public void setName(E name) {
        this.name = name;
    }
}

public class Demo02GenericClass {
    public static void main(String[] args) {
        GenericClass gc = new GenericClass();
        gc.setName("隻能說字元串");

        Object obj = gc.getName();
        // 建立GenericClass對象,泛型使用Integer類型
        GenericClass<Integer> gc2 = new GenericClass<>();
        gc2.setName(2);
        Integer name = gc2.getName();
        System.out.println(name);

        // 建立GenericClass對象,泛型使用String類型
        GenericClass<String> gc3 = new GenericClass<>();
        gc3.setName("張三");
        String s = gc3.getName();
        System.out.println(s);
    }
}