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