1. 程式人生 > >Java中List及其實現類的解析

Java中List及其實現類的解析

集合:

集合,集合是java中提供的一種容器,可以用來儲存多個數據。集合的長度是可變的,集合中儲存的元素必須是引用型別資料。

集合繼承關係圖:

        

List:

         List是一個介面,繼承自Collection,除了有Collection的方法以外,又有多的屬於自己的方法,比如add()、remove()等等。

public static void function(){
        List<String> list = new ArrayList<String>();
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        list.add("abc4");
        System.out.println(list);
        
        list.add(1, "itcast");
        System.out.println(list);
      }
public static void function_1(){
        List<Double> list = new ArrayList<Double>();
        list.add(1.1);
        list.add(1.2);
        list.add(1.3);
        list.add(1.4);
        
        Double d = list.remove(0);
        System.out.println(d);
        System.out.println(list);
      }

                              

ArrayList:

首先說一下ArrayList類,檢視ArrayList類原始碼發現它繼承了抽象類AbstractList同時實現介面List,而List介面又繼承了Collection介面,還實現了介面Serializable,可序列化的物件,底層採用的是陣列結構(把物件轉換為位元組序列的過程稱為物件的序列化把位元組序列恢復為物件的過程稱為物件的反序列化

)。

指定了序列化UID,還把ArrayList的預設長度指定為10。

                        

三個建構函式,空引數是一個預設為10長度的列表;也可以放入一個集合作為它的一個元素;也可以初始化指定它的大小的空列表;那麼我們看看他們是怎麼新增元素和刪除元素的。

Add方法:

無論是指定索引插入還是尾部插入,首先確保是否是有足夠的空間可以插入,如果有就直接插入元素。

如果沒有足夠空間,那麼是如何擴充的呢?

注意此處擴充capacity的方式是將其向右一位再加上原來的數,實際上是擴充了1.5倍,再和minCapacity比較,如果還是不夠,就把size擴充至minCapacity。如果是隊尾插入就可以直接添加了。

Indexof方法:

這個方法是實現查詢引數的索引,看原始碼,如果傳入的是null,那麼返回-1,如果不是空在判斷是不是在佇列裡,如果在,返回相應的位置,如果不在,返回-1。

Remove方法:

Remove方法有兩種刪除,引數是指定索引和引數是物件兩種形式。

1、引數是指定索引,首先判斷索引是否存在,如果不存在就會報邊界溢位異常,如果在陣列範圍內,就把index之後的資料整體向前移動一位,最後一位值清空。

2、如果傳入的是一個物件,就會進行一次indexOf的操作根據返回值判斷是否存在,如果存在就呼叫fastRemove方法刪除掉元素,如果不存在,則返回false。

Get方法:

首先判斷輸入索引是否越界,如果不越界的話,返回該索引上的元素。

Set方法:

判斷輸入索引是否越界,如果越界丟擲異常,如果不越界,就把需要修改的值傳給該索引,同時返回該索引以前的值。

LinkedList:

底層採用連結串列結構,還是一個雙向連結串列,每次查詢都要從鏈頭或鏈尾找起,查詢相對陣列較慢但是刪除直接修改元素記錄的地址值即可,不需要大量移動元素。LinkedList的索引決定是從鏈頭開始找還是從鏈尾開始找,如果該元素小於元素長度一半,從鏈頭開始找起,如果大於元素長度的一半,則從鏈尾找起。

Add()方法:

1、插入是在尾部插入,把newNode的前面節點執行現在的尾部節點,newNode的後面節點執行null,因為是在尾部,所以把現在的尾部節點的後面節點指向newNode,因為現在的尾部節點不是最後一個了。

2、不在尾部插入,假設現在在6號位插入一個newNode

就是通過現在的6號Node的prev找到5號節點,然後修改5號節點的next,指向nowNode,然後nowNode的prev指向5號節點,next指向6號節點,最後6號節點的prev變成了nowNode,next不變。

IndexOf方法:

判斷是否為空,如果為空,返回-1並結束;如果不為空,從首節點開始,逐個向後比較,找到後返回自己的索引。

Remove方法:

無引數,預設刪除頭結點。把頭節點的值清空,next清空,然後把nextNode只為頭節點,然後清空next的prev,最後size減1。

如果是不是空引數,首先判斷Index對應的節點是否為頭節點,即index是否為0,如果不是中間節點,就是x的prev指向x的next;如果是中間節點,就把index的節點的next的pre只想next的pre,把next的pre的next指向index的next,刪掉index即可。

            

Vector:

Vector集合資料儲存的結構是陣列結構,為JDK中最早提供的集合,它是執行緒同步的Vector中提供了一個獨特的取出方式,就是列舉Enumeration,它其實就是早期的迭代器。此介面Enumeration的功能與 Iterator 介面的功能是類似的。Vector集合已被ArrayList替代。列舉Enumeration已被迭代器Iterator替代。