1. 程式人生 > >JAVA基礎複習十五-Collection集合子類-List集合的子類

JAVA基礎複習十五-Collection集合子類-List集合的子類

一、陣列與集合

* 陣列和集合儲存引用資料型別,存的都是地址值

二、集合的由來及集合繼承體系圖

* A:集合的由來
    * 陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義,太麻煩,java內部給我們提供了集合類,能儲存任意物件,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少 

* B:陣列和集合的區別
    * 區別1 : 
        * 陣列既可以儲存基本資料型別,又可以儲存引用資料型別,基本資料型別儲存的是值,引用資料型別儲存的是地址值
        * 集合只能儲存引用資料型別(物件)集合中也可以儲存基本資料型別,但是其實是在儲存的時候會自動裝箱變成物件
    * 區別2:
        * 陣列長度是固定的,不能自動增長
        * 集合的長度的是可變的,可以根據元素的增加而增長,1.5倍增長(部分集合底層也是用陣列來做的)

* C:陣列和集合什麼時候用
        * 1,如果元素個數是固定的推薦用陣列
        * 2,如果元素個數不是固定的推薦用集合

這裡寫圖片描述

三、Collection集合的基本功能

這裡寫圖片描述

1.boolean add(E e)E是新增的泛型,表示本集合中只能新增那種型別的元素
    add方法如果是list集合,一致返回true,因為list集合中是可以儲存重複元素的,如果是set集合上儲存重複元素的時候,就會返回false
arraylist的父類的父類重寫了toString方法
    可以新增所有的資料型別
2.boolean remove(Object o)//刪除指定元素
3.void clear()//清空集合
4.boolean contains(Object o)//是否包含
5.boolean isEmpty()//判斷集合是否為空
6.int size()//獲取集合中元素的個數

四、Collection集合的帶All功能

boolean addAll(Collection c)
boolean removeAll(Collection c)//刪除的是交集
boolean containsAll(Collection c)//可以有重複的
boolean retainAll(Collection c)//取交集,並把交集賦值給呼叫者,若交集為空,呼叫者也被賦值為空,值改變了所以返回true,只要呼叫者值改變了就返回true(包括交集為空),否則返回false(呼叫者是被呼叫者的子集)

五、集合的遍歷之迭代器遍歷

* A:迭代器概述
    * 集合是用來儲存元素,儲存的元素需要檢視,那麼就需要迭代(遍歷) 
        Iterator it = c.iterator();//獲取迭代器的引用
        while(it.hasNext()) {   //如果集合中有下一個元素
            System.out.println(it.next());取出下一個元素(從0開始)
        }

六、迭代器的原理及原始碼解析

* A:迭代器原理
    * 迭代器原理:迭代器是對集合進行遍歷,而每一個集合內部的儲存結構都是不同的,所以每一個集合存和取都是不一樣,那麼就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出介面,然後在每個類的內部,定義自己迭代方式,這樣做的好處有二,第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,程式碼有底層內部實現,使用者不用管怎麼實現的,會用即可
        *比如ArrayList有自己特有的迭代器ListIterator

七、List集合的特有功能

* A:List集合的特有功能概述
    * void add(int index,E element)
    * E remove(int index)只能刪除索引,因為不會自動裝箱,否則就亂了。比如說集合中有一個元素是1,那麼remove(1)是刪除1這個元素,還是1這個索引位置的元素呢。所以不自動裝箱,就刪除索引位置對應的元素,下同
    * E get(int index)
    * E set(int index,E element)
    * 

八、集合遍歷中的併發修改異常產生的原因及解決方案

* A:需求:我有一個集合,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。

        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("world");
        list.add("d");
        list.add("e");

        Iterator it = list.iterator();
        while(it.hasNext()) {
            String str = (String)it.next();
            if(str.equals("world")) {
                list.add("javaee");         //這裡會丟擲ConcurrentModificationException併發修改異常,遍歷的同時增刪元素,引起併發修改異常。因為集合在用迭代器之前就已經告訴它自己有多少個元素了,迭代器就按這麼多元素去迭代,結果在迭代途中增刪元素,迭代器就受不了了。
            }
        }

* B:解決方案
    * a:迭代器迭代元素,用特有的迭代器修改元素(ListIterator的特有功能add)
    * b:集合遍歷元素,集合修改元素

        ListIterator lit = list.listIterator();     //如果想在遍歷的過程中新增元素,可以用ListIterator中的add方法
        while(lit.hasNext()) {
            String str = (String)lit.next();
            if(str.equals("world")) {
                lit.add("javaee");  
                //list.add("javaee");
            }
        }

九、ListIterator

* boolean hasNext()是否有下一個
* boolean hasPrevious()是否有前一個
* Object next()返回下一個元素
* Object previous();返回上一個元素

十、Vector,已經被淘汰

* A:Vector類概述
    * Vector是JDK1.0出來的,從JDK1.2之後出現Collection集合,其中的ArrayList代替了Vector的功能,就把它放在了List集合的下面。它是執行緒安全的所以相比較ArrayList效率低,底層也是用陣列實現的。
* B:Vector類特有功能
    * public void addElement(E obj)
    * public E elementAt(int index)
    * public Enumeration elements()
* C:案例演示    
    * Vector的迭代

        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());//獲取集合中的元素
        }

十一、資料結構之陣列和連結串列

* A:陣列
    * 查詢快修改也快(給相應索引,就直接給到相應所以對應的值,所以查詢快,找到了才能修改,所以修改也快)
    * 增刪慢(陣列增加一個元素,是把想要增加元素的索引位置後面的的所有元素全部複製,向後移動一位,再把增加的元素增加進去。刪除一個元素就是把後面所有的元素複製,向前覆蓋,再把最後一個元素置空,所以增刪很費事,慢)

這裡寫圖片描述
* B:連結串列
* 查詢慢,修改也慢(先判斷要查詢的索引在中間位置的左邊還是右邊,在左邊就從頭一個一個向後查詢,在右邊就從最後一個物件向前一個一個查詢,所以查詢慢,查到了才能修改,自然修改也慢)
* 增刪快(連結串列結構中,每個物件只需要記住自己前面和後面物件即可,所以增加一個元素,只需要破壞增加位置的原來兩個元素的連結,增加進去就可以了,刪除也是一樣,所以快。)
這裡寫圖片描述

十二、List的三個子類的特點

ArrayList:
    底層資料結構是陣列,查詢快,增刪慢。
    執行緒不安全,效率高。
Vector:
    底層資料結構是陣列,查詢快,增刪慢。
    執行緒安全,效率低。
    Vector相對ArrayList查詢慢(執行緒安全的)
    Vector相對LinkedList增刪慢(陣列結構)
LinkedList:
    底層資料結構是連結串列,查詢慢,增刪快。
    執行緒不安全,效率高。

Vector和ArrayList的區別
    Vector是執行緒安全的,效率低
    ArrayList是執行緒不安全的,效率高
    共同點:底層都是陣列實現的
ArrayList和LinkedList的區別
        ArrayList底層是陣列結構,查詢和修改快
        LinkedList底層是連結串列結構的,增和刪比較快,查詢和修改比較慢
    共同點:都是執行緒不安全的
* B:List有三個兒子,我們到底使用誰呢?
    查詢修改多用ArrayList
    增刪多用LinkedList
    如果都多ArrayList