https://blog.csdn.net/shengmingqijiquan/article/details/52634640 一.ArrayList概述 ArrayList 是一個數組隊列,相當於動態數組。與Java中的數組相比,它的容量能動態增長。它繼承於AbstractList,實現了Lis ...
https://blog.csdn.net/shengmingqijiquan/article/details/52634640
一.ArrayList概述
- ArrayList 是一個數組隊列,相當於動態數組。與Java中的數組相比,它的容量能動態增長。它繼承於AbstractList,實現了List,RandomAccess[隨機訪問],Cloneable[可克隆], java.io.Serializable[序列化]這些介面。
- ArrayList 繼承了AbstractList,實現了List。它是一個數組隊列,提供了相關的添加、刪除、修改、遍歷等功能。
- ArrayList 實現了RandmoAccess介面,即提供了隨機訪問功能。RandmoAccess是java中用來被List實現,為List提供快速訪問功能的。在ArrayList中,我們即可以通過元素的序號快速獲取元素對象;這就是快速隨機訪問。稍後,我們會比較List的“快速隨機訪問”和“通過Iterator迭代器訪問”的效率。
- ArrayList 實現了Cloneable介面,即覆蓋了函數clone(),能被克隆。
- ArrayList 實現java.io.Serializable介面,這意味著ArrayList支持序列化,能通過序列化去傳輸。
- 和Vector不同,ArrayList中的操作不是線程安全的。所以,建議在單線程中才使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList。
二.ArrayList之API
1.ArrayList和Collection之間的關係
*實線代表直接繼承的父類,虛線代表實現的介面;2.ArrayList類的API
- <span style="font-family:Microsoft YaHei;">// Collection中定義的API
- boolean add(E object)//添加一個數組對象
- boolean addAll(Collection<? extends E> collection)//添加一個包含Collection的對象
- void clear()//清空
- boolean contains(Object object)//包含
- boolean containsAll(Collection<?> collection)
- boolean equals(Object object)//判等
- int hashCode()
- boolean isEmpty()//判空
- Iterator<E> iterator()
- boolean remove(Object object)//刪除
- boolean removeAll(Collection<?> collection)
- boolean retainAll(Collection<?> collection)
- int size()
- <T> T[] toArray(T[] array)
- Object[] toArray()
- // AbstractCollection中定義的API
- void add(int location, E object)
- boolean addAll(int location, Collection<? extends E> collection)
- E get(int location)//獲取某個元素值
- int indexOf(Object object)
- int lastIndexOf(Object object)
- ListIterator<E> listIterator(int location)
- ListIterator<E> listIterator()
- E remove(int location)
- E set(int location, E object)
- List<E> subList(int start, int end)
- // ArrayList新增的API
- Object clone()//
- void ensureCapacity(int minimumCapacity)//保證容量不小於元素個數
- void trimToSize()
- void removeRange(int fromIndex, int toIndex)
- </span>
3.ArrayList的源碼解析
- <span style="font-family:Microsoft YaHei;">package java.util;
- public class ArrayList<E> extends AbstractList<E>
- implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- {
- // 序列版本號
- private static final long serialVersionUID = 8683452581122892189L;
- // 保存ArrayList中數據的數組
- private transient Object[] elementData;
- // ArrayList中實際數據的數量
- private int size;
- // ArrayList帶容量大小的構造函數。
- public ArrayList(int initialCapacity) {
- super();
- if (initialCapacity < 0)
- throw new IllegalArgumentException("Illegal Capacity: "+
- initialCapacity);
- // 新建一個數組
- this.elementData = new Object[initialCapacity];
- }
- // ArrayList構造函數。預設容量是10。
- public ArrayList() {
- this(10);
- }
- // 創建一個包含collection的ArrayList
- public ArrayList(Collection<? extends E> c) {
- elementData = c.toArray();
- size = elementData.length;
- // c.toArray might (incorrectly) not return Object[] (see 6260652)
- if (elementData.getClass() != Object[].class)
- elementData = Arrays.copyOf(elementData, size, Object[].class);
- }
- // 將當前容量值設為 =實際元素個數
- public void trimToSize() {
- modCount++;
- int oldCapacity = elementData.length;
- if (size < oldCapacity) {
- elementData = Arrays.copyOf(elementData, size);
- }
- }
- // 確定ArrarList的容量。
- // 若ArrayList的容量不足以容納當前的全部元素,設置 新的容量=“(原始容量x3)/2 + 1”
- public void ensureCapacity(int minCapacity) {
- // 將“修改統計數”+1
- modCount++;
- int oldCapacity = elementData.length;
- // 若當前容量不足以容納當前的元素個數,設置 新的容量=“(原始容量x3)/2 + 1”
- if (minCapacity > oldCapacity) {
- Object oldData[] = elementData;
- int newCapacity = (oldCapacity * 3)/2 + 1;
- if (newCapacity < minCapacity)
- newCapacity = minCapacity;
- elementData = Arrays.copyOf(elementData, newCapacity);
- }
- }
- // 添加元素e
- public boolean add(E e) {
- // 確定ArrayList的容量大小
- ensureCapacity(size + 1); // Increments modCount!!
- // 添加e到ArrayList中
- elementData[size++] = e;
- return true;
- }
- // 返回ArrayList的實際大小
- public int size() {
- return size;
- }
- // 返回ArrayList是否包含Object(o)
- public boolean contains(Object o) {
- return indexOf(o) >= 0;
- }
- // 返回ArrayList是否為空
- public boolean isEmpty() {
- return size == 0;
- }
- // 正向查找,返回元素的索引值
- public int indexOf(Object o) {
- if (o == null) {
- for (int i = 0; i < size; i++)
- if (elementData[i]==null)
- return i;
- } else {
- for (int i = 0; i < size; i++)
- if (o.equals(elementData[i]))
- return i;
- }
- return -1;
- }
- // 反向查找,返回元素的索引值
- public int lastIndexOf(Object o) {
- if (o == null) {
- for (int i = size-1; i >= 0; i--)
- if (elementData[i]==null)
- return i;
- } else {
- for (int i = size-1; i >= 0; i--)
- if (o.equals(elementData[i]))
- return i;
- }
- return -1;
- }
- // 反向查找(從數組末尾向開始查找),返回元素(o)的索引值
- public int lastIndexOf(Object o) {
- if (o == null) {
- for (int i = size-1; i >= 0; i--)
- if (elementData[i]==null)
- return i;
- } else {
- for (int i = size-1; i >= 0; i--)
- if (o.equals(elementData[i]))
- return i;
- }
- return -1;
- }
- // 返回ArrayList的Object數組
- public Object[] toArray() {
- return Arrays.copyOf(elementData, size);
- }
- // 返回ArrayList的模板數組。所謂模板數組,即可以將T設為任意的數據類型
- public <T> T[] toArray(T[] a) {
- // 若數組a的大小 < ArrayList的元素個數;
- // 則新建一個T[]數組,數組大小是“ArrayList的元素個數”,並將“ArrayList”全部拷貝到新數組中
- if (a.length < size)
- return (T[]) Arrays.copyOf(elementData, size, a.getClass());
- // 若數組a的大小 >= ArrayList的元素個數;
- // 則將ArrayList的全部元素都拷貝到數組a中。
- System.arraycopy(elementData, 0, a, 0, size);
- if (a.length > size)
- a[size] = null;
- return a;
- }
- // 獲取index位置的元素值
- public E get(int index) {
- RangeCheck(index);
- return (E) elementData[index];
- }
- // 設置index位置的值為element
- public E set(int index, E element) {
- RangeCheck(index);
- E oldValue = (E) elementData[index];
- elementData[index] = element;
- return oldValue;
- }
- // 將e添加到ArrayList中
- public boolean add(E e) {
- ensureCapacity(size + 1); // Increments modCount!!
- elementData[size++] = e;
- return true;
- }
- // 將e添加到ArrayList的指定位置
- public void add(int index, E element) {
- if (index > size || index < 0)
- throw new IndexOutOfBoundsException(
- "Index: "+index+", Size: "+size);
- ensureCapacity(size+1); // Increments modCount!!
- System.arraycopy(elementData, index, elementData, index + 1,
- size - index);
- elementData[index] = element;
- size++;
- }
- // 刪除ArrayList指定位置的元素
- public E remove(int index) {
- RangeCheck(index);
- modCount++;
- E oldValue = (E) elementData[index];
- int numMoved = size - index - 1;
- if (numMoved > 0)
- System.arraycopy(elementData, index+1, elementData, index,
- numMoved);
- elementData[--size] = null; // Let gc do its work
- return oldValue;
- }
- // 刪除ArrayList的指定元素
- public boolean remove(Object o) {
- if (o == null) {
- for (int index = 0; index < size; index++)
- if (elementData[index] == null) {
- fastRemove(index);
- return true;
- }
- } else {
- for (int index = 0; index < size; index++)
- if (o.equals(elementData[index])) {
- fastRemove(index);
- return true;
- }
- }
- return false;
- }
- // 快速刪除第index個元素
- private void fastRemove(int index) {
- modCount++;
- int numMoved = size - index - 1;
- // 從"index+1"開始,用後面的元素替換前面的元素。
- if (numMoved > 0)
- System.arraycopy(elementData, index+1, elementData, index,
- numMoved);
- // 將最後一個元素設為null
- elementData[--size] = null; // Let gc do its work
- }
- // 刪除元素
- public boolean remove(Object o) {
- if (o == null) {
- for (int index = 0; index < size; index++)
- if (elementData[index] == null) {
- fastRemove(index);
- return true;
- }
- } else {
- // 便利ArrayList,找到“元素o”,則刪除,並返回true。
-
for (<