ArrayList 繼承至父類 AbstractList實現接口 List,RandomAccess,Cloneable克隆接口,Serializable可序列化接口java
注意到如下三個主要變量 兩個靜態變量(存在於JVM的Method Area 方法區)一個Object得數組類型數組
其中EMPTY_ELEMENTDATA 是new ArrayList()時初始化得一個空對象數組數據結構
初始化長度爲DEFAULT_CAPACITY得值dom
來看arrayList的幾個主要方法ui
添加方法主要調用ensureCapacityInternal方法 這個方法 以下 主要是作長度判斷的 若是加入的對象使得arrayList得長度 超過默認得10以後 會作grow操做 就是增加操做.net
增加操做則是在原有得長度 len/2+len 將原有得數組複製到新的數組裏面 並賦值回去 舊的數組 在通過一次GC以後消亡。下面來看get操做對象
檢查index值是否在長度以內 若是不是拋出indexoutofBoundsException 數組越界異常blog
若是在 這直接經過數組下標獲取對象值 返回。繼承
-----------------------------------------------------------------------這裏是分割線接口
鑑於工做中碰到remove的操做 剛好看了看這塊 仍是準備把心得寫下來 已作不時之需
一下主要探討 remove(Object) 和removeAll(Collections)
1.能夠看到remove 中主要作的操做是更具下標遍歷數組 而後調用Object.equals方法 這個方法源碼以下
比較的是兩個對象的地址。這個涉及到 java虛擬機中對象的存儲結構 當兩個對象數據徹底同樣的時候 java虛擬機不會從新建立一個對象 而是將兩個變量指向同一塊內存區
如 String a="123" ,String b=new String("123"),a和b引用的是同一塊地址
2.找到相同的對象以後,拿到他的下標index 調用fastRemove方法 遍歷index+1以後的元素 將其所有前挪一位 並將最後一個元素置爲Null
在通過一次Minor GC以後 這個地方的內存將會被釋放
removeAll(Collection)
源碼中使用三行代碼就完成 將全部不存在與參數列表C的元素從數組 elementDate 0開始從新賦值 組裝成新的數組 這裏complement爲false
而後以w爲開始 遍歷 並將元素賦值爲null 注意 第一個IF 是用來處理contains異常使用的 當拋出異常的時候 r是不等與size的 會走第一個if 若是不拋出異常 會直接走第二個IF
總結:以上能夠看書 ArrayList集合 是基於數組實現的一個數據結構 數組元素爲Object
增加機制爲 新建一個爲原來1.5倍長的數組 將元素複製過去便可
附上JVM虛擬機內存結構模型文檔
https://blog.csdn.net/luomingkui1109/article/details/72820232