day11

先瞄准再开枪發表於2024-10-17

Collection

/*
    到目前位置,我們學習過哪些可以儲存元素的容器:
    1、陣列
        優點:不同的陣列可以儲存不同資料型別的元素
        缺點:長度不可變
    2、StringBuffer|StringBuilder
        優點:長度可以跟隨元素的數量而改變
        缺點:裡面的元素只有一種字元資料型別

    我們今後會根據元素的是否重複,儲存和取出的順序等來決定我們該使用什麼樣的容器來進行儲存
    根據我現實生活中經驗來說,容器應該是豐富多彩的,多種多樣的
    java應該要使用若干個不同的類來描述不同的容器,表示不同容器的特點。
    容器應該都有若槓共同的特點,都可以裝東西等。
    那麼java中提供的這些類中成員應該也會有相同的部分,那我們將其向上提取,由繼承或實現來構建關係
    這樣我們就可以得到一個繼承體系。

    Collection【介面】:
        我們透過幫助文件發現,Collection是一個介面,不能直接new物件
        根據元素是否可以發生重複,繼續分類
        - List【介面】元素可以發生重複,且有索引的概念
            ArrayList
        - Set【介面】元素不可以發生重複,沒有索引

   藉助ArrayList子類物件來使用Collection介面中的方法

   學習java中任意一個集合的步驟:
    1、建立相關集合物件
    2、建立元素物件
    3、將元素新增到集合中
    4、遍歷集合

    Collection中的成員方法:
        boolean add(E e)
        boolean remove(Object o)
        void clear()
        boolean contains(Object o)
        boolean isEmpty()
        int size()

//藉助ArrayList建立物件來使用Collection介面中的方法
        // 1、建立相關集合物件
        Collection c1 = new ArrayList();

        //boolean add(Object e)
        c1.add(100); //這裡涉及到自動裝箱 int -> Integer
        c1.add(true);
        c1.add(12.34);
        c1.add(1000L);
        c1.add(100);
        c1.add(12.34);
        // 重寫toString()方法的類是ArrayList類的父類的父類中重寫的。
        // 底層是使用StringBuilder實現的
 //boolean remove(Object o) 從集合中刪除一個元素,只會刪除最左邊的一個匹配元素
        c1.remove(100);
        System.out.println("c1: " + c1);
        System.out.println("-----------------------------------------");
        //void clear() 清空集合元素
//        c1.clear();
//        System.out.println("c1: " + c1);
        System.out.println("-----------------------------------------");
        //boolean contains(Object o) 判斷Collection集合中是否包含某個元素
        System.out.println(c1.contains(12.34));
        System.out.println("-----------------------------------------");
        //boolean isEmpty() 判斷Collection集合是否為空
        System.out.println(c1.isEmpty());
        System.out.println("-----------------------------------------");
        //int size() 獲取集合的長度【元素的個數】
        System.out.println(c1.size());

        boolean addAll(Collection c)//兩個集合合併 去重看具體的實現子類
        boolean removeAll(Collection c)//刪除集合中含有另一個集合的元素
        boolean containsAll(Collection c)//集合中是否包含另一個集合的所有元素
        boolean retainAll(Collection c)// 求交集 將結果儲存在呼叫方法的物件集
/*
    如何遍歷一個Collection集合
    1、Object[] toArray() 把集合轉成陣列,可以實現集合的遍歷
 */
public class CollectionDemo3 {
    public static void main(String[] args) {
        Collection c1 = new ArrayList();
        c1.add("hello");
        c1.add("world");
        c1.add("java");
        c1.add("hadoop");
        c1.add("world");

        Object[] objects = c1.toArray();
        for(int i=0;i<objects.length;i++){
            Object obj = objects[i]; // "hello"
            String s = (String)obj;
            //向下轉型,才可使用元素自己型別的方法
            System.out.println(s+"-"+s.length());
        }
迭代器
 //每一個迭代器,都有一個獨立指標,每呼叫一次next()方法,就會向後移動一次指標取資料
        //iterator.hasNext()用來判斷下一個位置上是否有元素
        while (iterator.hasNext()){
            Object obj = iterator.next();
            String s = (String)obj;
            System.out.println(s+"-"+s.length());
        }
集合遍歷
// 4、遍歷集合
        //方式1:轉陣列遍歷
//        Object[] objects = c1.toArray();
//        for(int i=0;i<objects.length;i++){
//            Object obj = objects[i];
//            Student s = (Student) obj;
//            System.out.println(s.getName()+"-"+s.getAge());
//        }

        //方式2:迭代器遍歷
        Iterator iterator = c1.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();
            Student s = (Student) obj;
            System.out.println(s.getName()+"-"+s.getAge());
        }

list集合

/*
    List集合:元素可以發生重複,有序(指儲存和取出的順序一致)
    Collection【介面】:
         - List【介面】
            ArrayList
         - Set【介面】

    List集合中特有的成員方法:
        void add(int index,E element)
        E remove(int index)
        E get(int index)
        E set(int index,E element)
        ListIterator listIterator()

 */
public class ListDemo1 {
    public static void main(String[] args) {
        List list1 = new ArrayList();

        list1.add("hello");
        list1.add("apple");
        list1.add("banana");
        list1.add("watermelon");
        list1.add("mango");

        System.out.println("list1: " + list1);

        System.out.println("==================================");
        //因為List相關集合具備索引的特點,List集合根據索引提供一些其它集合沒有的方法
        //void add(int index,E element) 指定索引位置新增元素 grape
        list1.add(2,"grape");
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        // E remove(int index) 根據索引從集合中移除元素
        System.out.println(list1.remove(2));
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        //E get(int index) 根據索引獲取對應元素
        System.out.println(list1.get(3));
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        //E set(int index,E element) 指定索引位置修改元素
        System.out.println(list1.set(3, "orange"));
        System.out.println("list1: " + list1);
        System.out.println("==================================");
        //ListIterator listIterator()
        ListIterator listIterator = list1.listIterator();
        //從前向後取
        while (listIterator.hasNext()){
            System.out.println(listIterator.next());
        }
        System.out.println("==================================");
        //從後向前取
        //注意:一個集合迭代器只有一個遊標,要想倒著遍歷,必須先正著遍歷一遍,所以該方法用的較少
        while (listIterator.hasPrevious()){
            System.out.println(listIterator.previous());
        }

/*
    需求:遍歷集合,當遇到mango的時候,向集合中新增一個元素"java"

    我們發現如果使用迭代器遍歷,集合發生修改的話,報錯了
    ConcurrentModificationException

 */
public class ListDemo2 {
    public static void main(String[] args) {
        List list1 = new ArrayList();

        list1.add("hello");
        list1.add("apple");
        list1.add("banana");
        list1.add("watermelon");
        list1.add("mango");
        list1.add("peach");
        list1.add("pear");

        System.out.println("list1: " + list1);
        System.out.println("======================================");
        //1、轉陣列遍歷
//        Object[] objects = list1.toArray();
//        for(int i=0;i<objects.length;i++){
//            Object obj = objects[i];
//            String s = (String) obj;
//            if("mango".equals(s)){
//                list1.add("java");
//            }
//        }
//        System.out.println("list1: "+list1);
//        System.out.println("======================================");

        //2、使用迭代器遍歷
//        Iterator iterator = list1.iterator();
//        while (iterator.hasNext()){
//            Object obj = iterator.next();
//            String s = (String) obj;
//            if("mango".equals(s)){
//               list1.add("java");
//            }
//        }
//        System.out.println("list1: "+list1);

        //使用List集合中特有的迭代器進行遍歷比較,且使用它進行新增元素
        ListIterator listIterator = list1.listIterator();
        while (listIterator.hasNext()) {
            Object obj = listIterator.next();
            String s = (String) obj;
            if ("mango".equals(s)) {
                listIterator.add("java");
            }
        }
        System.out.println("list1: " + list1);


    }
}