Collection源碼分析(一):ArrayList源碼分析

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

相關文章
相關標籤/搜索