亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java集合源碼分析系列-(一)ArrayList源碼剖析

Miyang / 2923人閱讀

摘要:需要注意的是,通過構(gòu)造函數(shù)定義初始量是動態(tài)數(shù)組的實際大小。帶容量的構(gòu)造函數(shù)新建一個容量為的數(shù)組默認(rèn)構(gòu)造函數(shù),默認(rèn)為空構(gòu)造一個包含指定元素的第一個構(gòu)造方法使用提供的來初始化數(shù)組的大小。

前言

今天介紹經(jīng)常使用的一個Java集合類——ArrayList(基于JDK1.8.0_121)。ArrayList在工作和日常面試中經(jīng)常被使用或者提到??偟膩碚f,工作中使用ArrayList主要是因為動態(tài)數(shù)組的方便性,面試中出現(xiàn)ArrayList經(jīng)常是和LinkedList/Vector一起出現(xiàn),分析這三種集合的異同。

ArrayList類圖

圖片是直接從IntelliJ中導(dǎo)出來的,其中:藍(lán)色線條意味著繼承,綠色線條意味著接口實現(xiàn)。

ArrayList源碼剖析 ArrayList定義
public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable

我們首先需要明白并且牢記在內(nèi)心的是,ArrayList本質(zhì)上是一個數(shù)組,但是與Java中基礎(chǔ)的數(shù)組所不同的是,它能夠動態(tài)增長自己的容量。
通過ArrayList的定義,可以知道ArrayList繼承了AbstractList,同時實現(xiàn)了List,RandomAccess,Cloneable和java.io.Serializable接口。

繼承了AbstractList類,實現(xiàn)了List,意味著ArrayList是一個數(shù)組隊列,提供了諸如增刪改查、遍歷等功能。
實現(xiàn)了RandomAccess接口,意味著ArrayList提供了隨機(jī)訪問的功能。RandomAccess接口在Java中是用來被List實現(xiàn),用來提供快速訪問功能的。在ArrayList中,即我們可以通過元素的序號快速獲取元素對象。
實現(xiàn)了Cloneable接口,意味著ArrayList實現(xiàn)了clone()函數(shù),能被克隆。
實現(xiàn)了java.io.Serializable接口,意味著ArrayList能夠通過序列化進(jìn)行傳輸。

ArrayList關(guān)鍵屬性
private static final int DEFAULT_CAPACITY = 10;
transient Object[] elementData;
private int size;

(1)ArrayList的默認(rèn)容量為10;
(2)elementData是"Object類型的數(shù)組",所有ArrayList元素都保存在elementData中。在ArrayList中,elementData是一個動態(tài)數(shù)組。需要注意的是,ArrayList通過構(gòu)造函數(shù)ArrayList(int initialCapacity)定義初始量initialCapacity;
(3)size是動態(tài)數(shù)組的實際大小。

//ArrayList帶容量的構(gòu)造函數(shù)
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
    //新建一個容量為initialCapacity的數(shù)組
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}
//ArrayList默認(rèn)構(gòu)造函數(shù),默認(rèn)為空
public ArrayList() {

    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// 構(gòu)造一個包含指定元素的list
public ArrayList(Collection c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

第一個構(gòu)造方法使用提供的initialCapacity來初始化elementData數(shù)組的大小。
第二個構(gòu)造方法默認(rèn)數(shù)組為0。
第三個構(gòu)造方法則將提供的集合轉(zhuǎn)成數(shù)組返回給elementData(返回若不是Object[]將調(diào)用Arrays.copyOf方法將其轉(zhuǎn)為Object[])。

ArrayList主要方法源碼剖析 增加
public boolean add(E e) {
    //擴(kuò)容判斷
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    //判斷index是否越界,錯誤產(chǎn)生IndexOutOfBoundsException
    rangeCheckForAdd(index);
    //進(jìn)行擴(kuò)容檢查
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    //對數(shù)組進(jìn)行復(fù)制,將空出的Index位置出入element,并將index后的所有數(shù)據(jù)后移一個位置。
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    //將index上的數(shù)據(jù)設(shè)置為element
    elementData[index] = element;
    //容量+1
    size++;
}
刪除
public E remove(int index) {
    //邊界檢查
    rangeCheck(index);
        
    modCount++;
    //oldValue即要刪除的元素
    E oldValue = elementData(index);
    //要復(fù)制的元素
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    //釋放最后一個元素
    elementData[--size] = null; // clear to let GC do its work

    return oldValue;
}

public boolean remove(Object o) {
    //對o進(jìn)行判斷
    if (o == null) {
        for (int index = 0; index < size; index++)
            if (elementData[index] == null) {
                fastRemove(index);
                return true;
            }
    } else {
        for (int index = 0; index < size; index++)
            if (o.equals(elementData[index])) {
                fastRemove(index);
                return true;
            }
    }
    return false;
}
更新
public E set(int index, E element) {
    //數(shù)組擴(kuò)容
    rangeCheck(index);
    //獲取要更新的位置的數(shù)據(jù)
    E oldValue = elementData(index);
    //更新元素
    elementData[index] = element;
    return oldValue;
}
總結(jié) 1.ArrayList底層是通過數(shù)組來保存數(shù)據(jù)的。默認(rèn)的容量是10. 2.JDK1.8中,ArrayList擴(kuò)容使用位運算newCapacity = oldCapacity + (oldCapacity >> 1) 3.ArrayList實現(xiàn)java.io.Serializable的方式。當(dāng)寫入到輸出流時,先寫入“容量”,再依次寫入“每一個元素”;當(dāng)讀出輸入流時,先讀取“容量”,再依次讀取“每一個元素”。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/67665.html

相關(guān)文章

  • Java集合總結(jié)【面試題+腦圖】,將知識點網(wǎng)打盡!

    摘要:而在集合中,值僅僅是一個對象罷了該對象對本身而言是無用的。將這篇文章作為集合的總結(jié)篇,但覺得沒什么好寫就回答一些面試題去了,找了一會面試題又覺得不夠系統(tǒng)。 前言 聲明,本文用的是jdk1.8 花了一個星期,把Java容器核心的知識過了一遍,感覺集合已經(jīng)無所畏懼了?。?哈哈哈....),現(xiàn)在來總結(jié)一下吧~~ 回顧目錄: Collection總覽 List集合就這么簡單【源碼剖析】 Ma...

    yearsj 評論0 收藏0
  • 文掌握關(guān)于Java數(shù)據(jù)結(jié)構(gòu)所有知識點(歡迎起完善)

    摘要:是棧,它繼承于。滿二叉樹除了葉結(jié)點外每一個結(jié)點都有左右子葉且葉子結(jié)點都處在最底層的二叉樹。沒有鍵值相等的節(jié)點。這是數(shù)據(jù)庫選用樹的最主要原因。 在我們學(xué)習(xí)Java的時候,很多人會面臨我不知道繼續(xù)學(xué)什么或者面試會問什么的尷尬情況(我本人之前就很迷茫)。所以,我決定通過這個開源平臺來幫助一些有需要的人,通過下面的內(nèi)容,你會掌握系統(tǒng)的Java學(xué)習(xí)以及面試的相關(guān)知識。本來是想通過Gitbook的...

    keithxiaoy 評論0 收藏0
  • Week 2 - Java 容器 - 詳細(xì)剖析 List 之 ArrayList, Vector,

    摘要:底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)之前為循環(huán)鏈表,取消了循環(huán)。快速隨機(jī)訪問就是通過元素的序號快速獲取元素對象對應(yīng)于方法。而接口就是用來標(biāo)識該類支持快速隨機(jī)訪問。僅僅是起標(biāo)識作用。,中文名為雙端隊列。不同的是,是線程安全的,內(nèi)部使用了進(jìn)行同步。 前言 學(xué)習(xí)情況記錄 時間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識點中,關(guān)于List的需要重點記錄的知識點。...

    MartinDai 評論0 收藏0
  • 集合框架源碼學(xué)習(xí)之ArrayList

    摘要:用戶自己指定容量創(chuàng)建大小的數(shù)組創(chuàng)建空數(shù)組默認(rèn)構(gòu)造函數(shù),其默認(rèn)初始容量為構(gòu)造一個包含指定集合的元素的列表,按照它們由集合的迭代器返回的順序。以正確的順序返回該列表中的元素的迭代器。此方法充當(dāng)基于陣列和基于集合的之間的橋梁。 目錄: 0-0-1. 前言 0-0-2. 集合框架知識回顧 0-0-3. ArrayList簡介 0-0-4. ArrayList核心源碼 0-0-5. Ar...

    BLUE 評論0 收藏0
  • List集合就這么簡單【源碼剖析

    摘要:線程不安全底層數(shù)據(jù)結(jié)構(gòu)是鏈表。的默認(rèn)初始化容量是,每次擴(kuò)容時候增加原先容量的一半,也就是變?yōu)樵瓉淼谋秳h除元素時不會減少容量,若希望減少容量則調(diào)用它不是線程安全的。 前言 聲明,本文用得是jdk1.8 前一篇已經(jīng)講了Collection的總覽:Collection總覽,介紹了一些基礎(chǔ)知識。 現(xiàn)在這篇主要講List集合的三個子類: ArrayList 底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組。線程不安全 ...

    cpupro 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<