ArrayList整理
生活随笔
收集整理的這篇文章主要介紹了
ArrayList整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ArrayList整理
- 1,ArrayList特性
- 2,ArrayList底層實現的特征
- 1),ArrayList初始化
- 2),初始容量
- 3),ArrayList的添加元素的add()方法
- 4),ArrayList的刪除方法remove(int index)
- 其他的一些方法的操作其實都差不多,所以就不過多累述了。
1,ArrayList特性
ArrayList底層是動態數組,所以根據數組的特性可知:
//可知ArrayList底層實際就是一個數據,通過transient修飾,標識不可以被序列化 transient Object[] elementData; 1),ArrayList中存儲元素位置的地址是一串連續的地址值。2),由于數組有索引,所以ArrayList對于元素的查找與修改效率快;增加與刪除效率低,因為需要移動目標元素之后的所有元素。3),但是在增加元素到最后一個位置與刪除最后一個元素效率是高的。2,ArrayList底層實現的特征
1),ArrayList初始化
//先定義了兩個個空數組 private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //再來看看ArrayList的三個構造函數 //1,自己傳入數組的初始容量(initialCapacity) public ArrayList(int initialCapacity) {//判斷我們傳入的初始容量是否大于0if (initialCapacity > 0) {//如果大于0,則直接使用new關鍵字創建長度為initialCapacity的數組,并將elementData指向該數組this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {//如果等于0,則將elementData指向之前定義的空數組this.elementData = EMPTY_ELEMENTDATA;} else {//小于0的話就拋出一個非法參數異常throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);} } //2,無參構造器 public ArrayList() {//如果是無參構造器的話,就直接將elementData指向之前定義的空數組(注意,沒看錯,就是空)this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } //3,傳入一個列表,根據傳入的列表創建一個ArrayList列表 public ArrayList(Collection<? extends E> c) {//首相我們看到傳入的集合調用了toArray()方法(將列表轉化成數組)//c.toArray();返回的是一個Object[]elementData = c.toArray();if ((size = elementData.length) != 0) {if (elementData.getClass() != Object[].class)//如果elementData不是一個Object[],那么就將elementData中的所有//元素都復制到一個Object[]中,再將該數組給elementDataelementData = Arrays.copyOf(elementData, size, Object[].class);} else {//如果傳入集合的長度是0,那么就將elementData指向空數組this.elementData = EMPTY_ELEMENTDATA;} }2),初始容量
//從這一段代碼可知ArrayList的初始容量是10 //但是默認初始化的時候卻是一空數組,所以初始化還沒結束,接下來的add方法我們回提到 private static final int DEFAULT_CAPACITY = 10;3),ArrayList的添加元素的add()方法
//向ArrayList中添加元素 public boolean add(E e) {//調用了一個ensureCapacityInternal方法,參數是size+1(size就是數組中元素的多少,不是數組長度,默認是0)ensureCapacityInternal(size + 1);//這時如果需要擴容的話就已經做好了擴容,直接賦值,不需要擴容就直接賦值elementData[size++] = e;return true; } //進入到ensureCapacityInternal方法 private void ensureCapacityInternal(int minCapacity) {//首先判斷了一下elementData是否是一個空數組,也就是第一次添加元素的時候對數組進行初始化(長度是10)if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//如果是的話,那么將DEFAULT_CAPACITY(先前提到,這就是默認長度10)與傳入的參數(size+1)中的最大值//給minCapacityminCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}//這里又調用了ensureExplicitCapacity方法,參數是剛剛取得的最大值ensureExplicitCapacity(minCapacity); } //進入ensureExplicitCapacity方法 private void ensureExplicitCapacity(int minCapacity) {//將modCount自增modCount++;//如果minCapacity大于數組的長度,說明我們這次添加元素會導致超出數組的長度//那么可知,原來這一串的方法都是為了一件事,那就是判斷是否需要擴容if (minCapacity - elementData.length > 0)//如果需要擴容的話,那么就調用grow方法,參數是minCapacitygrow(minCapacity); } //進入grow方法 private void grow(int minCapacity) {// 首先獲得數組的長度int oldCapacity = elementData.length;//新數組的長度是舊數組長度的2倍(右移2位標識原來的0.5)int newCapacity = oldCapacity + (oldCapacity >> 1);//如果計算出來的新數組長度小于minCapacity(即添加元素后數組的長度,size+1或者默認為10)if (newCapacity - minCapacity < 0)//則將minCapacity作為新數組長度//這一步主要就是調用無參構造時,默認長度是10,但是在初始化的時候數組還是0//所以在添加第一個元素的時候將數組進行初始化,即數組的長度是10newCapacity = minCapacity;//如果新數組的長度大于設置的最大數組長度if (newCapacity - MAX_ARRAY_SIZE > 0)//進入hugeCapacity方法newCapacity = hugeCapacity(minCapacity);// 使用Arrays.copyOf()方法將數組進行擴容,并將就數組中的元素全部復制到新數組中elementData = Arrays.copyOf(elementData, newCapacity); } //hugeCapacity方法 private static int hugeCapacity(int minCapacity) {//如果小于0則直接拋出異常if (minCapacity < 0) // overflowthrow new OutOfMemoryError();//如果大于最大設置的長度,則將int的最大值給它return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE; }4),ArrayList的刪除方法remove(int index)
//刪除指定位置元素 public E remove(int index) {//首先調用rangeCheck,作用是判斷傳入的index是否合法rangeCheck(index);//modCount自增modCount++;//將該位置的元素找出E oldValue = elementData(index);//判斷index所在的位置是否是最后一位int numMoved = size - index - 1;if (numMoved > 0)//如果index不在最后一位//則使用System.arraycopy()方法將index之后的所有元素賦值到index位置(從index位置開始)//例如:2,3,4,5 其中index = 1;//那么:使用System.arraycopy()后為 2,4,5,5System.arraycopy(elementData, index+1, elementData, index,numMoved);//將最后一位設置為nullelementData[--size] = null; // clear to let GC do its workreturn oldValue; }其他的一些方法的操作其實都差不多,所以就不過多累述了。
總結
以上是生活随笔為你收集整理的ArrayList整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html手机网页怎么写的(html手机网
- 下一篇: 反射、HashMap、ArrayList