摘要:如果這個是剛剛初始化好的容量為,則為默認值若容量不固定,則比較與的大小,返回最大值。現在最小容量大小超過現在數組的長度,增長自增倍大于溢出三元表達式,大于取整形最大值用新的長度創建一個新數組把原數組的內容拷貝到新數組中,并返回新數組
一、構造方法 1.創建一個空ArrayList
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
DEFAULTCAPACITY_EMPTY_ELEMENTDATA為private static final的Object[],值為{}
2.創建ArrayList對象的時候,把一個Collection或其子類添加進來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); } }
initialCapacity為初始化容量
EMPTY_ELEMENTDATA也為private static final的Object[],值為{}
public ArrayList(Collection extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { // c.toArray()可能沒有正確的返回一個Object數組對象 if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // 創建一個空的ArrayList this.elementData = EMPTY_ELEMENTDATA; } }二、添加
添加成功返回boolean類型值
public boolean add(E e) { //字面意思:確保容量存在,計算最小初始容量。 ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
如果這個ArrayList是剛剛初始化好的(容量為0),則為默認值:10;若容量不固定,則比較size與10的大小,返回最大值。
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // 現在最小容量大小超過現在數組的長度,增長 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//自增1.5倍 if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0)//大于MAX_ARRAY_SIZE newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // 溢出 throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? //三元表達式,大于MAX_ARRAY_SIZE取整形最大值 Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
public staticT[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass()); } public static T[] copyOf(U[] original, int newLength, Class extends T[]> newType) { // 用新的長度創建一個新數組 T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); // 把原數組的內容拷貝到新數組中,并返回新數組 System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70616.html
摘要:返回刪除元素的刪除方法記錄修改次數的變量根據數組下標拿到指定元素計算移動位數把中復制到,最后一個元素置為下標檢查,如果大于數組的,拋出異常返回一個值的刪除方法傳進來,刪除第一個值為的值注意此時加入了兩個值此時執行了一句只刪除了 1.返回刪除元素的刪除方法 public E remove(int index) { rangeCheck(index); modCo...
摘要:類庫中提供了一套相當完整的容器類來解決這個問題,其中基本類型有,,,,這些對象類型被稱為集合類。但是,類庫中使用了來指代集合類中的子集,,,所以集合類也被稱為容器。五類型是能夠將對象映射到其他對象的一種容器,有區別于的方法。 引言 如果一個程序只包含固定數量的且其生命周期都是已知對象,那么這是一個非常簡單的程序——《think in java》 了解容器前,先提出一個問題,ArrayL...
摘要:概述用久了,深受其約定大于配置的便利性毒害之后,我想回歸到時代,看看開發模式中用戶是如何參與的。備注當然本文所使用的全是非注解的配置方法,即需要在中進行配置并且需要遵循各種實現原則。而更加通用主流的基于注解的配置方法將在后續文章中詳述。 showImg(https://segmentfault.com/img/remote/1460000015244684); 概述 用久了Sprin...
摘要:可以看到,如果我們給泛型類制定了上限,泛型擦除之后就會被替換成類型的上限。相應的,泛型類中定義的方法的類型也是如此。參考語言類型擦除下界通配符和的區別 本篇博客主要介紹了Java類型擦除的定義,詳細的介紹了類型擦除在Java中所出現的場景。 1. 什么是類型擦除 為了讓你們快速的對類型擦除有一個印象,首先舉一個很簡單也很經典的例子。 // 指定泛型為String List list1 ...
摘要:注本文首發于公眾號,可長按或掃描下面的小心心來訂閱實驗環境版本版本首先當然需要安裝好環境,最好再安裝上可視化插件來便于我們直觀地查看數據。 showImg(https://segmentfault.com/img/remote/1460000015723674); 注: 本文首發于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓ showI...
閱讀 3018·2023-04-25 20:22
閱讀 3335·2019-08-30 11:14
閱讀 2590·2019-08-29 13:03
閱讀 3178·2019-08-26 13:47
閱讀 3218·2019-08-26 10:22
閱讀 1263·2019-08-23 18:26
閱讀 609·2019-08-23 17:16
閱讀 1908·2019-08-23 17:01