一、層級(jí)關(guān)系 二、初始化方式
(1)Listlist = new ArrayList<>(); public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
第一個(gè)結(jié)論:ArrayList底層是數(shù)組
第二個(gè)結(jié)論:若用無參構(gòu)造器的方式實(shí)例化ArrayList,只是聲明了數(shù)組,還未分配空間
(2)Listlist = new ArrayList<>(10); public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } private static final Object[] EMPTY_ELEMENTDATA = {};
補(bǔ)充第二結(jié)論:若用有參構(gòu)造器的方式實(shí)例化ArrayList且initialCapacity大于0,則既聲明了數(shù)組,也分配了空間
三、基本方法的使用 add流程圖
源碼解析
public boolean add(E e) { //校驗(yàn)數(shù)組容量,若空間不夠則擴(kuò)容復(fù)制生成一個(gè)新的數(shù)組 ensureCapacityInternal(size + 1); //賦值 elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } /** * 若數(shù)組是通過無參構(gòu)造器的方式實(shí)例化的話,返回的minCapacity為10,最后會(huì)通過grow方法復(fù)制生成一個(gè)大小為10的數(shù)組 * 若數(shù)組是通過有參構(gòu)造器的方式實(shí)例化的話,返回的minCapacity為當(dāng)前要操作的數(shù)組下標(biāo),不建議聲明小于10的數(shù)組空間,因?yàn)檫@樣前幾次add都要去擴(kuò)容復(fù)制生成一個(gè)新的數(shù)組 */ private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } //擴(kuò)容大小:原數(shù)組大小 + 原數(shù)組大小/2 private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
其它說明
初始化ArrayList時(shí),不建議聲明小于10的容量,因?yàn)檫@樣前幾次add都要去擴(kuò)容復(fù)制生成一個(gè)新的數(shù)組
Arrays.copyOf(T[] original, int newLength):該方法會(huì)創(chuàng)建一個(gè)新的數(shù)組
remove流程圖
源碼解析
public E remove(int index) { //檢查index是否 >= size,若大于則報(bào)數(shù)組越界異常 rangeCheck(index); modCount++; E oldValue = elementData(index); 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; }
其它說明
System.arraycopy - 淺復(fù)制
public static void arraycopy( Object src, //源數(shù)組 int srcPos, //源數(shù)組要復(fù)制的起始位置 Object dest, //目標(biāo)數(shù)組 int destPos, //目的數(shù)組放置的起始位置 int length //復(fù)制長(zhǎng)度 )四、補(bǔ)充
ArrayList是線程不安全的,表現(xiàn)在多線程下add和remove可能會(huì)發(fā)生數(shù)組越界
不要在foreach循環(huán)里進(jìn)行元素的remove/add操作。remove元素請(qǐng)使用Iterator方式,如果并發(fā)操作,需要對(duì)Iterator對(duì)象加鎖
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71558.html
摘要:自定義類的概述自定義類的概述代碼映射成現(xiàn)實(shí)事物的過程就是定義類的過程。自定義類的格式自定義類的格式使用類的形式對(duì)現(xiàn)實(shí)中的事物進(jìn)行描述。 01引用數(shù)據(jù)類型_類 * A: 數(shù)據(jù)類型 * a: java中的數(shù)據(jù)類型分為:基本類型和引用類型 * B: 引用類型的分類 * a: Java為我們提供好的類,比如說:Scanner,Random等。 * b: 我們自己創(chuàng)建的類...
摘要:需要注意的是,通過構(gòu)造函數(shù)定義初始量是動(dòng)態(tài)數(shù)組的實(shí)際大小。帶容量的構(gòu)造函數(shù)新建一個(gè)容量為的數(shù)組默認(rèn)構(gòu)造函數(shù),默認(rèn)為空構(gòu)造一個(gè)包含指定元素的第一個(gè)構(gòu)造方法使用提供的來初始化數(shù)組的大小。 前言 今天介紹經(jīng)常使用的一個(gè)Java集合類——ArrayList(基于JDK1.8.0_121)。ArrayList在工作和日常面試中經(jīng)常被使用或者提到。總的來說,工作中使用ArrayList主要是因?yàn)閯?dòng)...
摘要:第三階段常見對(duì)象的學(xué)習(xí)集合框架接口按照集合框架的繼承體系,我們先從中的接口開始學(xué)習(xí)一概述及功能演示概述在中充當(dāng)著一個(gè)什么樣的身份呢有序的也稱為序列實(shí)現(xiàn)這個(gè)接口的用戶以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制。線程不安全,效率高。 第三階段 JAVA常見對(duì)象的學(xué)習(xí) 集合框架——List接口 showImg(https://segmentfault.com/img/remote/14600...
摘要:主要用于遍歷集合中的元素,對(duì)象也被稱為迭代器。使用迭代過程中,不可修改集合元素迭代器采用快速失敗機(jī)制。一旦迭代過程中檢測(cè)到該集合已經(jīng)被修改,程序立即出發(fā)異常,而不是顯示修改后的結(jié)果,避免了共享資源而引發(fā)的潛在問題。 集合類和數(shù)組不一樣,數(shù)組元素既可以是基本類型的值,也可以是對(duì)象(實(shí)際上保存的是對(duì)象的引用變量);而集合里只能保存對(duì)象(實(shí)際上只是保存對(duì)象的引用變量,但通常習(xí)慣上認(rèn)為集...
摘要:集合代表一個(gè)元素有序可重復(fù)的集合,集合中每個(gè)元素都有其對(duì)應(yīng)的順序索引。集合默認(rèn)按元素的添加順序設(shè)置元素的索引。 List集合代表一個(gè)元素有序、可重復(fù)的集合,集合中每個(gè)元素都有其對(duì)應(yīng)的順序索引。List集合可以通過索引來訪問指定位置的集合元素。List集合默認(rèn)按元素的添加順序設(shè)置元素的索引。 Java8改進(jìn)的List接口和ListIterator接口 普通方法 List是有序集合,因此L...
摘要:用戶自己指定容量創(chuàng)建大小的數(shù)組創(chuàng)建空數(shù)組默認(rèn)構(gòu)造函數(shù),其默認(rèn)初始容量為構(gòu)造一個(gè)包含指定集合的元素的列表,按照它們由集合的迭代器返回的順序。以正確的順序返回該列表中的元素的迭代器。此方法充當(dāng)基于陣列和基于集合的之間的橋梁。 目錄: 0-0-1. 前言 0-0-2. 集合框架知識(shí)回顧 0-0-3. ArrayList簡(jiǎn)介 0-0-4. ArrayList核心源碼 0-0-5. Ar...
閱讀 3245·2021-09-22 16:06
閱讀 3236·2021-09-02 15:40
閱讀 632·2019-08-30 15:54
閱讀 1035·2019-08-26 12:22
閱讀 1375·2019-08-26 12:17
閱讀 2742·2019-08-26 12:09
閱讀 502·2019-08-26 10:20
閱讀 783·2019-08-23 16:28