Java編程基礎16——Colletion集合

1_對象數組的概述和使用

  • A:案例演示java

    • 需求:我有5個學生,請把這個5個學生的信息存儲到數組中,並遍歷數組,獲取獲得每個學生信息。
import net.allidea.bean.Student;
public class Colletion_1_Array {    
    public static void main(String[] args) {
//        int[] arr = new int[5];                    //建立基本數據類型數組
        Student[] arr = new Student[5];            //建立引用數據類型數組
        arr[0] = new Student("張三", 23);        //建立一個學生對象,存儲在數組第一個位置
        arr[1] = new Student("李四", 24);
        arr[2] = new Student("王五", 25);
        arr[3] = new Student("趙六", 26);
        arr[4] = new Student("馬哥", 20);
        
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);            //toString
        }
    }
}
  • B:畫圖演示算法

    • 把學生數組的案例畫圖講解
    • 數組和集合存儲引用數據類型,存的都是地址值

2_集合的由來及集合繼承體系圖

  • A:集合的由來數組

    • 數組長度是固定,當添加的元素超過了數組的長度時須要對數組從新定義,太麻煩,java內部給咱們提供了集合類,能存儲任意對象,長度是能夠改變的,隨着元素的增長而增長,隨着元素的減小而減小 。
  • B:數組和集合的區別安全

    • 區別1 :數據結構

      • 數組既能夠存儲基本數據類型,又能夠存儲引用數據類型,基本數據類型存儲的是值,引用數據類型存儲的是地址值
      • 集合只能存儲引用數據類型(對象)集合中也能夠存儲基本數據類型,可是在存儲的時候會自動裝箱變成對象。
    • 區別2:併發

      • 數組長度是固定的,不能自動增加。
      • 集合的長度的是可變的,能夠根據元素的增長而增加。
  • C:數組和集合何時用eclipse

    • 1,若是元素個數是固定的推薦用數組。
    • 2,若是元素個數不是固定的推薦用集合。
  • D:集合繼承體系圖ide

    • Collection(單列集合的根接口)測試

      • List(有序,存取順序一致,有索引,能夠重複存儲)idea

        • ArrayList(數組實現)
        • LinkedList(鏈表實現)
        • Vector(1.0數組實現)
      • Set(無序,不一致,無索引,不可重複存儲)

        • HashSet(哈希算法)
        • TreeSet(二叉樹算法)**

3_Collection集合的基本功能測試

  • A:案例演示

    • 基本功能演示
      boolean add(E e)
      boolean remove(Object o)
      void clear()
      boolean contains(Object o)
      boolean isEmpty()
      int size()
  • B:注意:

    • collectionXxx.java使用了未經檢查或不安全的操做.
      注意:要了解詳細信息,請使用 -Xlint:unchecked從新編譯,java編譯器認爲該程序存在安全隱患,舒適提示:這不是編譯失敗,因此先不用理會,等學了泛型你就知道了。
    • add方法若是是List集合一直都返回true,由於List集合中是能夠存儲重複元素的,若是是Set集合當存儲重複元素時候,就會返回false
    • ArrayList的父類的父類重寫toString方法,因此在打印對象的引用的時候,輸出的結果不是Object類中的toString結果
import java.util.ArrayList;
import java.util.Collection;
import net.allidea.bean.Student;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class Colletion_2_demo {    
    public static void main(String[] args) {
//        addDemo();
        Collection c = new ArrayList();        //父類引用指向子類對象
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        c.add("e");
        
//        c.remove("b");                        //刪除指定元素
        c.clear();                            //清空集合
//        System.out.println(c);
//        System.out.println(c.contains("b"));//判斷是否包含
        System.out.println(c.isEmpty());    //判斷是否爲空
        System.out.println(c.size());        //獲取元素的個數
    }

    private static void addDemo() {
        Collection c = new ArrayList();        //父類引用指向子類對象
        boolean b1 = c.add("abc");
        boolean b2 = c.add(true);            //自動裝箱new Boolean(true);
        boolean b3 = c.add(100);
        boolean b4 = c.add(new Student("張三",23));        //
        boolean b5 = c.add("abc");
        
        System.out.println(b1);
        System.out.println(b2);
        System.out.println(b3);
        System.out.println(b4);
        System.out.println(b5);
        System.out.println(c.toString());
    }
}

4_集合的遍歷之集合轉數組遍歷

  • A:集合的遍歷

    • 其實就是依次獲取集合中的每個元素。
  • B:案例演示

    • 把集合轉成數組,能夠實現集合的遍歷
import java.util.ArrayList;
import java.util.Collection;
import net.allidea.bean.Student;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class Colletion_3_demo {
    public static void main(String[] args) {
//        demo1();
        Collection c = new ArrayList();            //Object obj = new Student("張三",23);
        c.add(new Student("張三", 23));
        c.add(new Student("李四", 24));
        c.add(new Student("王五", 25));
        c.add(new Student("趙六", 26));
        
        Object[] arr = c.toArray();                //將集合轉換成數組
        for (int i = 0; i < arr.length; i++) {
//            System.out.println(arr[i]);
            Student s = (Student)arr[i];            //向下轉型
            System.out.println(s.getName() + "..." + s.getAge());
        }
    }

    private static void demo1() {
        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        
        Object[] arr = c.toArray();            //將集合轉換成數組
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

5_Collection集合的帶All功能測試

  • A:案例演示
    帶All的功能演示
    boolean addAll(Collection c)
    boolean removeAll(Collection c)
    boolean containsAll(Collection c)
    boolean retainAll(Collection c)
import java.util.ArrayList;
import java.util.Collection;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class Collection_4_demo {
    public static void main(String[] args) {
//        addAllDemo();
//        removeAllDemo();
//        containsAllDemo();
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");
        
        Collection c2 = new ArrayList();
        c2.add("a");
        c2.add("b");
//        c2.add("z");
        
        boolean b = c1.removeAll(c2);//取交集,若是調用的集合改變就返回true,若是調用的集合不變就返回false
        System.out.println(b);
        System.out.println(c1);
    }

    private static void containsAllDemo() {
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");
        
        Collection c2 = new ArrayList();
//        c2.add("a");
//        c2.add("b");
        c2.add("z");
        
        boolean b = c1.containsAll(c2);            //判斷調用的集合是否包含傳入的集合
        System.out.println(b);
    }

    private static void removeAllDemo() {
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");
        
        Collection c2 = new ArrayList();
        c2.add("a");
        c2.add("b");
        c2.add("z");

        boolean b = c1.removeAll(c2);        //刪除的是交集內容
        System.out.println(b);
        System.out.println(c1);
    }

    private static void addAllDemo() {
        Collection c1 = new ArrayList();
        c1.add("a");
        c1.add("b");
        c1.add("c");
        c1.add("d");
        
        Collection c2 = new ArrayList();
        c2.add("aa");
        c2.add("bb");
        c2.add("cc");
        c2.add("dd");
        
        c1.addAll(c2);                    //將c2總體元素添加到c1中
        c1.add(c2);                        //將c2當作一個對象添加到c1中
        System.out.println(c1);
    }
}

6_集合的遍歷之迭代器遍歷

  • A:迭代器概述

    • 集合是用來存儲元素,存儲的元素須要查看,那麼就須要迭代(遍歷)
  • B:案例演示

    • 迭代器的使用
    • Collection存儲自定義對象並用迭代器遍歷
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import net.allidea.bean.Student;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class Collection_5_demo {    
    public static void main(String[] args) {
//        demo1();
        Collection c = new ArrayList();
        c.add(new Student("張三",23));            //Object obj = new Student("張三",23);
        c.add(new Student("李四",24));
        c.add(new Student("王五",25));
        c.add(new Student("趙六",26));
        c.add(new Student("田七",27));

/*        for(Iterator it = c.iterator();it.hasNext();) {
            Student s = (Student)it.next();                        //向下轉型
            System.out.println(s.getName() + "," + s.getAge());    //獲取對象中的姓名和年齡
        }*/

//        獲取迭代器
        Iterator it = c.iterator();
        while(it.hasNext()) {
//            System.out.println(it.next());
            //System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge());
            Student s = (Student)it.next();        //向下轉型
            System.out.println(s.getName() + "..." + s.getAge());
        }
    }

    private static void demo1() {
        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        
        //對集合中的元素迭代(遍歷)
        Iterator it = c.iterator();            //獲取迭代器
        /*boolean b1 = it.hasNext();            //判斷集合中是否有元素,有就返回true
        Object obj1 = it.next();
        System.out.println(b1);
        System.out.println(obj1);
        
        boolean b2 = it.hasNext();            //判斷集合中是否有元素,有就返回true
        Object obj2 = it.next();
        System.out.println(b2);
        System.out.println(obj2);*/
        
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

7_迭代器的原理及源碼解析(瞭解)

  • A:迭代器原理

    • 迭代器原理:迭代器是對集合進行遍歷,而每個集合內部的存儲結構都是不一樣的,因此每個集合存和取都是不同,那麼就須要在每個類中定義hasNext()和next()方法,這樣作是能夠的,可是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出接口,而後在每一個類的內部,定義本身迭代方式,這樣作的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,代碼有底層內部實現,使用者不用管怎麼實現的,會用便可
  • B:迭代器源碼解析

    • 1,在eclipse中ctrl + shift + t找到ArrayList類
    • 2,ctrl+o查找iterator()方法
    • 3,查看返回值類型是new Itr(),說明Itr這個類實現Iterator接口
    • 4,查找Itr這個內部類,發現重寫了Iterator中的全部抽象方法

8_List集合的特有功能概述和測試

  • A:List集合的特有功能概述

    • void add(int index,E element)
    • E remove(int index)
    • E get(int index)
    • E set(int index,E element)
import java.util.ArrayList;
import java.util.List;

public class List_1_demo {

/*    * A:List集合的特有功能概述
    * void add(int index,E element)
    * E remove(int index)
    * E get(int index)
    * E set(int index,E element)*/
    
    public static void main(String[] args) {
//        demo1();
//        demo2();
//        demo3();
//        demo4();
        demo5();
        
    }

    private static void demo5() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        list.set(1, "z");
        System.out.println(list);        //將制定位置的元素修改
    }

    private static void demo4() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
//        Object obj1 = list.get(1);
//        System.out.println(obj1);
        //經過索引遍歷list集合
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    private static void demo3() {
        List list = new ArrayList();
        list.add(111);
        list.add(222);
        list.add(333);
        
        list.remove(0);                        //刪除的時候不會自動裝箱,把111當索引
        System.out.println(list);
    }

    private static void demo2() {
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        Object obj = list.remove(1);        //經過索引刪除元素,將被刪除的元素返回
        System.out.println(obj);
        System.out.println(list);
    }

    private static void demo1() {
        List list = new ArrayList();        //開發時直接建立子類對象
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add(1, "f");        //index <= size且>=零均可以
//        list.add(1, "e");
//        list.add(10,"z");        //使用不存在的索引時,索引越界異常java.lang.IndexOutOfBoundsException
        System.out.println(list);
    }
}

9_List集合存儲學生對象並遍歷

  • A:案例演示

    • 經過size()和get()方法結合使用遍歷。
import java.util.List;
import java.util.ArrayList;
import net.allidea.bean.Student;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class List_2_demo {    
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Student("張三",23));            //Object obj = new Student("張三",23);
        list.add(new Student("李四",24));
        list.add(new Student("王五",25));
        list.add(new Student("趙六",26));
        list.add(new Student("田七",27));
        
        for (int i = 0; i < list.size(); i++) {        //經過索引獲取每個元素
//            System.out.println(list.get(i));
            Student s = (Student)list.get(i);
            System.out.println(s.getName() + "..." + s.getAge());
        }
    }
}

10_併發修改異常產生的緣由及解決方案

  • A:案例演示

    • 需求:我有一個集合,請問,我想判斷裏面有沒有"world"這個元素,若是有,我就添加一個"javaee"元素,請寫代碼實現。
List list = new ArrayList<>();
        list.add("a");        //Object obj = new String();
        list.add("b");
        list.add("c");
        list.add("world");
        list.add("d");
        list.add("e");
        
        Iterator it = list.iterator();    //獲取迭代器
        while(it.hasNext()) {
            String str = (String)it.next();//向下轉型
            if("world".equals(str)) {
                list.add("javaee");        //遍歷的同時在增長元素,併發修改ConcurrentModificationException
            }
            System.out.println(list);
        }
  • B:ConcurrentModificationException出現

    • 迭代器遍歷,集合修改集合
  • C:解決方案

    • a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
    • b:集合遍歷元素,集合修改元素
ListIterator lit = list.listIterator();    //獲取迭代器,list集合特有的
        while(lit.hasNext()) {
            String str = (String)lit.next();//向下轉型
            if("world".equals(str)) {
//                list.add("javaee");        //遍歷的同時在增長元素,併發修改ConcurrentModificationException
                lit.add("javaee");
            }
            System.out.println(list);
        }

11_ListIterator(瞭解)

  • boolean hasNext()是否有下一個
  • boolean hasPrevious()是否有前一個
  • Object next()返回下一個元素
  • Object previous();返回上一個元素
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class List_4_ListIterator {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("a");        //Object obj = new String();
        list.add("b");
        list.add("c");
        list.add("world");
        list.add("d");
        list.add("e");
        
        ListIterator lit = list.listIterator();
        /*while(lit.hasNext()) {
            System.out.println(lit.next());
        }*/
        System.out.println("------------");
        while(lit.hasPrevious()) {
            System.out.println(lit.previous());
        }
    }
}

12_Vector的特有功能(瞭解)

  • A:Vector類概述
  • B:Vector類特有功能

    • public void addElement(E obj)
    • public E elementAt(int index)
    • public Enumeration elements()
  • C:案例演示

    • Vector的迭代
import java.util.Enumeration;
import java.util.Vector;
public class List_5_Vector {
    public static void main(String[] args) {
        Vector v = new Vector();            //建立集合對象,List的子類
        v.addElement("a");
        v.addElement("b");
        v.addElement("c");
        v.addElement("d");
        //Vector迭代
        Enumeration en = v.elements();        //獲取枚舉
        while(en.hasMoreElements()) {        //判斷集合中是否有元素
            System.out.println(en.nextElement());//獲取集合中的元素    
        }
    }
}

13_數據結構之數組和鏈表

  • A:數組

    • 查詢快修改也快(有索引)
    • 增刪慢(排隊模式)
  • B:鏈表

    • 查詢慢,修改也慢(傳花法)
    • 增刪快(無順序)

14_List的三個子類的特色

  • A:List的三個子類的特色

    • ArrayList:

      • 底層數據結構是數組,查詢快,增刪慢。
      • 線程不安全,效率高。
    • Vector:

      • 底層數據結構是數組,查詢快,增刪慢。
      • 線程安全,效率低。
    • Vector相對ArrayList查詢慢(線程安全的)
    • Vector相對LinkedList增刪慢(數組結構)
    • LinkedList:

      • 底層數據結構是鏈表,查詢慢,增刪快。
      • 線程不安全,效率高。
    • Vector和ArrayList的區別

      • Vector是線程安全的,效率低
      • ArrayList是線程不安全的,效率高
      • 共同點:都是數組實現的
    • ArrayList和LinkedList的區別

      • ArrayList底層是數組結果,查詢和修改快
      • LinkedList底層是鏈表結構的,增和刪比較快,查詢和修改比較慢
      • 共同點:都是線程不安全的
  • B:List有三個兒子,咱們到底使用誰呢?

    • 查詢多用ArrayList
    • 增刪多用LinkedList
    • 若是都多ArrayList
相關文章
相關標籤/搜索