1.ArrayList【重點】
2.LinkedList【開發不用,但是面試會問】
3.Object【所有的超類】
4.Set接口
1.ArrayList
首先看官方API
Collection下面有一個子接口叫List
List接口下面有一個實現類叫ArrayList
ArrayList也是容器,可以放數據
源碼分析
/**
* Default initial capacity.
默認的變量,變量值是10 默認的初始化的容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* Shared empty array instance used for empty instances.
聲明了一個空的數組EMPTY_ELEMENTDATA 變量
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
默認容量的空數組
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
數組的有效的容量 size 默認值是0
*/
private int size;
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
構造方法,在實例化的時候調用有參數的構造
*/
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);
}
}
/**
* Constructs an empty list with an initial capacity of ten.
無參數的構造方法
構造了一個初始化容量為10的空的數組
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//擴容的方法。當數組的容量不夠的話,會自動擴容
private void grow(int minCapacity) {
// overflow-conscious code
//oldCapacity 是老的容量
int oldCapacity = elementData.length;//10個容量 數組里面只能放10個元素
//newCapacity新的容量 (oldCapacity >> 1);叫位元算符
// int newCapacity = oldCapacity + oldCapacity * 0.5;
//int newCapacity = 1.5 * oldCapacity;//擴容的是原來數組的1.5倍
//原來的數據是10 擴容以后的容量是15
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
//擴容完以后,進行數組的賦值
//[1,2,3,4,5,6,7,8,9,10] 原來的數組
//[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 在賦值一個數組這個數組容量是15
//進行數組的擴容了,新的數組還有有老數組中的數據
//所以使用copy方法
elementData = Arrays.copyOf(elementData, newCapacity);
}
面試題:
ArrayList處理數據的特征:
增數據刪數據比較慢。為什么?
增加數據效率低:
1.有可能會涉及到數組的擴容,涉及到數組的copy
2.添加數據到指定位置的時候,會導致從添加數據位置開始整體后移
刪除數據效率低: