集合(List)

集合(List)


一、簡介

1.Java集合框架的由來

其實在Java2(jdk1.2)之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴展的容器類,比如Vector,Stack,Hashtable等。 爲什麼存在容器類: 容器類(集合類)可以存儲多個數據,既然數組可以存儲多個數據,爲什麼需要定義容器類.

2.數組的弊端

1): 長度是不可變的,一旦數組初始化之後,長度是固定的.

2): 在N個地方需要存儲多個數據,都得專門去編寫數組的操作方法,如此以來,沒有體現DRY原則. 代碼和功能重複-------->封裝思想.

3): 即使每一個人都要使用到數組類,但是不同的人定義的類名和方法名是不同的,實現細節也是參差不齊的. SUN公司就自己定義好了容器類,每一個開發者只管調用即可.

在集合框架這個章節: 拿來主義.

3.什麼是集合框架

儘管這些容器類非常好用,但是卻不能集中和統一管理。集合框架是爲表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容:對外的接口、接口的實現和對集合運算的算法(底層都對應着某一種數據結構的算法)。

4.爲什麼需要集合框架

(把集合框架的類和接口都存放在java.util包中):

1):提供功能的複用(java.util包).

2):讓程序工作者專注於業務開發,而不是數據結構和算法.

5.常用的框架接口規範

集合中存儲的對象,稱之爲集合元素.

6.常用的集合類

Set(集):集合中的對象不按特定方式排序,不允許元素重複.

List(列表):集合中的對象按照索引位置排序,允許元素重複.

Map(映射):集合中每一個元素都包含一對key和value對象.不允許key對象重複,值對象可以重複.

在這裏插入圖片描述


二、List實現類性能和特點分析

在這裏插入圖片描述

1.List接口
  1. ​ 重複性:數據可以重複
  2. ​ null值:可以有null存在
  3. ​ 有序性:保證數據的插入有序
2.面向接口編程

接口類型 變量 = new 實現類();List list = new ArrayList();


3.ArrayList與LinkedList的特點(及源碼探究)

ArrayList

特點:

重複性:數據可以重複

有序性:能保證數據的插入有序

null值:可以有 null值存在

LinkedList:

特點:

重複性:可以重複存儲數據

有序性:數據按照插入有序

null值:可以存儲null值


ArrayList源碼探究:

1.繼承關係
2.底層數據結構
3.基本屬性(包括“默認值”)
4.構造函數
5.增長方式

//1.繼承關係
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList繼承AbstractList,父類中對部分接口進行實現
實現了List接口提供的方法,Serializable說明該類能夠被序列化 ,能夠被克隆、序列化

//2.底層數據結構
ArrayList底層數據結構是"數組"

//3.基本屬性
private static final int DEFAULT_CAPACITY = 10;
默認容量大小
private static final Object[] EMPTY_ELEMENTDATA = {};
默認數組大小
private transient Object[] elementData;
存儲元素的數組
private int size;
集合存儲元素的個數

//4.構造函數
    public ArrayList(int initialCapacity) {
        super();
        //指定大小不合法,則直接拋出異常
        初始化數組大小
        
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }
    //有參構造,指定集合初始化大小
    

    public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }
    //無參構造

    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }
    
    //有參構造,通過集合來創建新的集合
    
//5.增長方式
按照原數組的1.5倍進行擴容

LinkedList源碼探究:

1.繼承關係
2.底層數據結構
3.基本屬性(包括“默認值”)
4.構造函數
5.增長方式

//1.繼承關係
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
extends AbstractSequentialList<E>對List接口的實現
implements Deque<E>  具有隊列的特徵:先進先出 
提供了特殊的方法,從頭、從尾進行添加、刪除、獲取

//2.底層數據結構
底層數據結構是“雙向鏈表”

//3.基本屬性(包括“默認值”,無默認值)
屬性:
    transient int size = 0;  集合中元素個數
    transient Node<E> first; 頭結點
    transient Node<E> last; 尾結點

    private static class Node<E> {
        E item;  存儲元素
        Node<E> next;  後繼節點
        Node<E> prev;  前驅節點

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

//4.構造函數
構造函數
    public LinkedList() {
    }

    public LinkedList(Collection<? extends E> c) {
        this();
        addAll(c);
    }
    
//5.增長方式
LinkedList提供頭插,尾插方式插入節點、默認採用的是尾插

4.ArrayList與LinkedList的相同點和不同點

ArrayList、LinkedList的異同點,各自優勢(應用場景)

相同點:

  1. 繼承關係:List接口下的實現類,具有list提供的所有方法
  2. 有序性:數據都是按照插入有序
  3. 重複性:集合中元素是可以重複的
  4. null值:都可以存儲 null值
  5. 安全性:都是非線程安全的集合

不同點:

  1. 數據結構:ArrayList底層是數組、LinkedList底層是鏈表(雙向鏈表)
  2. 特有方法:LinkedList具有特有的方法,列如:addFirst、addLast。(實現Deque接口)
  3. 效率:ArrayList查詢效率高O(1)、LinkedList添加o(1)、刪除效率高->ArrayList添加元素趨近於O(1)\在不擴容情況下就是O(1)

使用的選擇:

  1. 如果刪除和插入操作頻繁,應該選擇LinkedList類.
  2. 如果查詢操作頻繁,應該使用ArrayList類.

ArrayList和數組有什麼區別?

  1. 初始化大小:ArrayList可以不指定大小,數組必須制定大小

  2. 存儲數據類型:ArrayList只能存儲引用類型,數組可以存儲引用類型和基本類型

                  2019.2.23/週六
                  by 922
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章