摘要:的源碼分析擴(kuò)容機(jī)制初始化值默認(rèn)數(shù)組的初始化容量空數(shù)組元素空數(shù)組元素存儲元素的數(shù)組緩沖區(qū)元素個(gè)數(shù)每次數(shù)據(jù)進(jìn)行修改都會(huì)主要是在一些非線程安全的時(shí)候,檢測是否出現(xiàn)混亂構(gòu)造方法默認(rèn)數(shù)組的長度為自己定義初始化的容量添加元素將元素和數(shù)組長度數(shù)
Arraylist的源碼分析(擴(kuò)容機(jī)制-JDK 10)
初始化值
private static final long serialVersionUID = 8683452581122892189L; 默認(rèn)數(shù)組的初始化容量 private static final int DEFAULT_CAPACITY = 10; 空數(shù)組元素 private static final Object[] EMPTY_ELEMENTDATA = {}; 空數(shù)組元素 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 存儲ArrayList元素的數(shù)組緩沖區(qū) transient Object[] elementData; // non-private to simplify nested class access 元素個(gè)數(shù) private int size; 每次數(shù)據(jù)進(jìn)行修改都會(huì)+1---主要是在一些非線程安全的時(shí)候,檢測是否出現(xiàn)混亂 protected transient int modCount = 0;
構(gòu)造方法
默認(rèn)數(shù)組的長度為10
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
自己定義初始化的容量
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); } }
添加元素
public boolean add(E e) { modCount++; 將元素和數(shù)組長度、數(shù)組大小(元素的個(gè)數(shù))傳過去 add(e, elementData, size); return true; } private void add(E e, Object[] elementData, int s) { 如果元素的個(gè)數(shù)和數(shù)組的長度相等,那么就需要對數(shù)組進(jìn)行擴(kuò)容 if (s == elementData.length) elementData = grow(); 如果不是,則將元素添加到最后(元素的最后) elementData[s] = e; 并且元素個(gè)數(shù)+1 size = s + 1; }
開始擴(kuò)容—擴(kuò)容的方法
private Object[] grow() { 將可允許的數(shù)組的最小容量傳過去(元素個(gè)數(shù)(size+1)—因?yàn)橐砑右粋€(gè)元素) return grow(size + 1);
}
private Object[] grow(int minCapacity) { 調(diào)用復(fù)制的方法,在原來元素基礎(chǔ)上增加容量 return elementData = Arrays.copyOf(elementData, newCapacity(minCapacity)); } private int newCapacity(int minCapacity) { // overflow-conscious code 獲取數(shù)組的長度(默認(rèn)的或是自己定義的) int oldCapacity = elementData.length; 新的容量是原容量的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); 新容量比可允許的最小容量小,那么新的容量就是可允許的最小的容量 之所以會(huì)有這個(gè)判斷,是因?yàn)槲覀兛梢宰约憾x初始容量,而不一定是默認(rèn)的容量 if (newCapacity - minCapacity <= 0) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) return Math.max(DEFAULT_CAPACITY, minCapacity); if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return minCapacity; } 如果新容量大于數(shù)值的最大值,傳入huge方法, return (newCapacity - MAX_ARRAY_SIZE <= 0) ? newCapacity : hugeCapacity(minCapacity);
}
可允許的最小容量是否越界,如果新容量大于數(shù)組默認(rèn)的最大值,賦給它整型的最大值
private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73459.html
摘要:源碼分析構(gòu)造方法有兩個(gè)構(gòu)造方法,一個(gè)是無參,另一個(gè)需傳入初始容量值。所以我們可以把上面的代碼轉(zhuǎn)換一下,等價(jià)于下面形式這個(gè)時(shí)候,我們再去分析一下的迭代器源碼就能找出原因。原因是刪除元素后,元素計(jì)數(shù)器,而迭代器中的也等于,從而導(dǎo)致返回。 1.概述 ArrayList 是一種變長的集合類,基于定長數(shù)組實(shí)現(xiàn)。ArrayList 允許空值和重復(fù)元素,當(dāng)往 ArrayList 中添加的元素?cái)?shù)量大于...
摘要:用戶態(tài)不能干擾內(nèi)核態(tài)所以指令就有兩種特權(quán)指令和非特權(quán)指令不同的狀態(tài)對應(yīng)不同的指令。非特權(quán)指令所有程序均可直接使用。用戶態(tài)常態(tài)目態(tài)執(zhí)行非特權(quán)指令。 這是我今年從三月份開始,主要的大廠面試經(jīng)過,有些企業(yè)面試的還沒來得及整理,可能有些沒有帶答案就發(fā)出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會(huì)持續(xù)更新,請各位持續(xù)關(guān)注,希望對你有所幫助! 面試清單 平安產(chǎn)險(xiǎn) 飛豬 上汽大通 浩鯨科...
摘要:常用集合使用場景分析過年前的最后一篇,本章通過介紹,,,底層實(shí)現(xiàn)原理和四個(gè)集合的區(qū)別。和都是線程安全的,不同的是前者使用類,后者使用關(guān)鍵字。面試官會(huì)認(rèn)為你是一個(gè)基礎(chǔ)扎實(shí),內(nèi)功深厚的人才到這里常用集合使用場景分析就結(jié)束了。 Java 常用List集合使用場景分析 過年前的最后一篇,本章通過介紹ArrayList,LinkedList,Vector,CopyOnWriteArrayList...
摘要:當(dāng)真正對數(shù)組進(jìn)行添加元素操作時(shí),才真正分配容量。下面在我們分析擴(kuò)容時(shí)會(huì)降到這一點(diǎn)內(nèi)容二一步一步分析擴(kuò)容機(jī)制這里以無參構(gòu)造函數(shù)創(chuàng)建的為例分析先來看方法將指定的元素追加到此列表的末尾。 該文已加入開源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識)。地址:https://github.com/Snailclimb... 一 先從 ArrayList 的構(gòu)造函數(shù)...
摘要:底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu)之前為循環(huán)鏈表,取消了循環(huán)。快速隨機(jī)訪問就是通過元素的序號快速獲取元素對象對應(yīng)于方法。而接口就是用來標(biāo)識該類支持快速隨機(jī)訪問。僅僅是起標(biāo)識作用。,中文名為雙端隊(duì)列。不同的是,是線程安全的,內(nèi)部使用了進(jìn)行同步。 前言 學(xué)習(xí)情況記錄 時(shí)間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識點(diǎn)中,關(guān)于List的需要重點(diǎn)記錄的知識點(diǎn)。...
閱讀 1664·2019-08-30 15:55
閱讀 985·2019-08-30 15:44
閱讀 879·2019-08-30 10:48
閱讀 2052·2019-08-29 13:42
閱讀 3193·2019-08-29 11:16
閱讀 1278·2019-08-29 11:09
閱讀 2064·2019-08-26 11:46
閱讀 624·2019-08-26 11:44