List
- List是一個有序的集合.使用者可以直接通過下標來獲取元素.
- List與Set不同,它允許重復元素的存在.
- List繼承與Collections,它的主要實現有ArrayList,LinkedList,Vector等等.
- 集合在遍歷的同時,進行插入刪除操作會造成錯誤.
ArrayList
List的一個實現類,同時也繼承了接口RandomAccess,Cloneable, java.io.Serializable.它是具有fail-fast機制.
ArrayList默認的容量大小為10
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
- ArrayList提供了兩個默認的空數據存儲對象.調用無參構造器的時候,真正存儲數據的elementData對象將會賦值為DEFAULTCAPACITY_EMPTY_ELEMENTDATA;調用有參的構造器時,elementData賦值為EMPTY_ELEMENTDATA.那么,為甚么要這樣做?他是為了,在數據添加并且進行擴容的時候,知道當前容器擴容的大小.當elementData為DEFAULTCAPACITY_EMPTY_ELEMENTDATA時,就會自動擴容到DEFAULT_CAPACITY或者傳入minCapacity(擴容大小);而當elementData為EMPTY_ELEMENTDATA時,好,這個時候elementData的大小已經是確定的了,直接根據elementData.length擴容至其1.5倍即可.
/**
* 在有參構造時,被調用
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* 在無參構造時,被調用
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
- ArrayList對外提供的擴容方法:
/**
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
- ArrayList對外提供了將容器大小轉為當前容器存儲元素個數大小的方法.
/**
* Trims the capacity of this <tt>ArrayList</tt> instance to be the
* list's current size. An application can use this operation to minimize
* the storage of an <tt>ArrayList</tt> instance.
*/
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
- ArrayList無法保證線程安全,需要使用者自己保證線程安全.
LinkedList
- 底層通過雙向鏈表機制實現.
- 插入或者刪除元素時,時間復雜度為O(1);查詢元素時時間復雜度為O(n);