Java集合類--List篇

1. 集合類概述

Java中以一種比數(shù)組存儲更復雜的方式來存儲對象的一組對象---“容器類”,其基本類
型有List、Set和Map,它們被組織在以Collection及Map接口為根的層次結(jié)構(gòu)中,稱之為集合框架。

2. Collection接口

Collection的層次結(jié)構(gòu)圖

2.1 List篇

List的特征是其元素以線性的方式的存儲,集合中允許放重復元素。
List接口主要的實現(xiàn)類有:
- ArrayList() : 代表長度可以動態(tài)改變的數(shù)組;可以對元素進行隨機的訪問,向ArrayList
中插入與刪除元素的速度慢。

- LinkedList() : 采用鏈表結(jié)構(gòu)實現(xiàn)。其插入和刪除的速度快。

2.1.1 List遍歷方式:

(1)for循環(huán)遍歷

/**
*   List中的get(int index)方法支持取指定下標的元素
*/
1)使用一般for循環(huán)
    for(int i = 0 ; i < list.size ; i ++) {
        E obj = list.get(i);
    }
2)使用增強型for循環(huán)
    for(E obj : list) {
    }

(2)使用迭代器(Iterator)

/**
*   Collection集合接口繼承了Iterator接口,允許集合被迭代
*   迭代方式如下:
*/
Iterator<E> it = list.iterator();
while(it.hasNext()) {
    E obj = it.next();
}

2.1.2 ArrayList實現(xiàn)原理

ArrayList部分源碼分析:

/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;

// 存放元素的數(shù)組
private transient Object[] elementData;

/* 構(gòu)造方法,
*   @param initialCapacity : 設(shè)置數(shù)組的初始容量
*/
public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
    this.elementData = new Object[initialCapacity];
}

從源碼可以分析出:ArrayList采用一個Object型對象數(shù)組來存放元素,默認初始容量為10。

public boolean add(E e) {
    // 當添加元素時判斷數(shù)組容量超出可容納范圍時會自動擴容
    // 具體會調(diào)用grow(int minCapacity)方法
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

// 該方法會自動給數(shù)組擴大一倍,數(shù)組可被擴大的最大容量為Integer.MAX_VALUE 
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    ....省略部分代碼 
}

2.1.3 LinkedList實現(xiàn)原理

LinkedList采用雙向鏈表結(jié)構(gòu)來實現(xiàn)的,使用結(jié)點來存儲數(shù)據(jù)域和連接前一個和后一個結(jié)點.

static class Node<E> {
    E item;         // 用來保存數(shù)據(jù)域
    Node<E> next;   // 下一個結(jié)點
    Node<E> prev;   // 上一個結(jié)點

    ....此處省略
}

// 代指第一個結(jié)點
transient Node<E> first;

transient Node<E> last;

// 這里只做add方法的講解
public boolean add(E e) {
    // 鏈接下一個結(jié)點
    linkLast(e);
    return true;
}

void linkLast(E e) {
    // 保存當前的最后一個結(jié)點
    final Node<E> l = last;
    //創(chuàng)建一個新添加元素的結(jié)點,前一個結(jié)點為該鏈表的最后一個結(jié)點
    final Node<E> newNode = new Node<E>(l , e , null);
    // 將新結(jié)點作為最后一個結(jié)點
    last = newNode;
    // 如果未添加前最后一個結(jié)點為空,則說明此時鏈表沒有元素,將新結(jié)點作為首結(jié)點
    // 否則將新結(jié)點鏈接在末尾
    if(l != null) 
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

LinkedList數(shù)據(jù)結(jié)構(gòu)是鏈式結(jié)構(gòu),具體查閱數(shù)據(jù)結(jié)構(gòu)相關(guān)的書籍。

2.1.4 ArrayList和LinkedList比較

ArrayList和LinkedList的區(qū)別:

1.ArrayList是實現(xiàn)了基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)。
2.對于隨機訪問get和set,ArrayList覺得優(yōu)于LinkedList,因為LinkedList要移動指針。
3.對于新增和刪除操作add和remove,LinedList比較占優(yōu)勢,因為ArrayList要移動數(shù)據(jù)。

2.2 List使用場景

如果涉及到“棧”、“隊列”、“鏈表”等操作,應(yīng)該考慮用List,具體的選擇哪個List,根據(jù)下面的標準來取舍。
01) 對于需要快速插入,刪除元素,應(yīng)該使用LinkedList。

02) 對于需要快速隨機訪問元素,應(yīng)該使用ArrayList。

03) 對于“單線程環(huán)境” 或者 “多線程環(huán)境,但List僅僅只會被單個線程操作”,此時應(yīng)該使用非同步的類(如ArrayList)。
    對于“多線程環(huán)境,且List可能同時被多個線程操作”,此時,應(yīng)該使用同步的類(如Vector)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內(nèi)容

  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,282評論 0 16
  • Java集合 作為一個Developer,Java集合類是我們在工作中運用最多的、最頻繁的類。相比于數(shù)組(Arra...
    賈博巖閱讀 65,800評論 14 103
  • 本篇文章帶你從Java源碼深入解析關(guān)于Java容器的概念。 參考文獻: Java容器相關(guān)知識全面總結(jié) Java官方...
    Tsy遠閱讀 19,820評論 13 142
  • 一.線性表 定義:零個或者多個元素的有限序列。也就是說它得滿足以下幾個條件:??①該序列的數(shù)據(jù)元素是有限的。??②...
    Geeks_Liu閱讀 2,703評論 1 12
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,712評論 18 399