ArrayList源码的理解
1. ArrayList的属性。
public class ArrayList {
// 版本号
private static final long serialVersionUID = 8683452581122892189L;
// 缺省容量
private static final int DEFAULT_CAPACITY = 10;
// 空对象数组
private static final Object[] EMPTY_ELEMENTDATA = {};
// 缺省空对象数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 元素数组
transient Object[] elementData;
// 实际元素大小,默认为0
private int size;
// 最大数组容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
}
2.ArrayList的构造方法
//无参构造
public ArrayList() {
//DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是个空的Object[],将elementData初始化,elementData也是个Object[]类型,空的object[]长度默认也是0
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//有参构造
public ArrayList(int length) {
if (length > 0) {
this.elementData = new Object[initialCapacity];
} else if (length == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //如输入的长度小于0,将会抛出异常,结束程序。
}
}
3. ArrayList的方法
3.1 add方法
public boolean add(E e) { // 添加元素
if(size)
elementData[size++] = e;
return true;
}
3.2 set方法
public E set(int index, E element) {
// 检验索引是否合法
if(index >= siez ||index <0) {
throw new ArrayIndexOutOfBoundsException();
}
// 旧值
E oldValue = elementData(index);
// 赋新值
elementData[index] = element;
// 返回旧值
return oldValue;
}
3.3 get方法
public E get(int index) {
// 检验索引是否合法
if(index >= siez ||index <0) {
throw new ArrayIndexOutOfBoundsException();
}
return elementData(index);
}
3.4 remove方法
public E remove(int index){
if(index < 0 || index >= size()){
throw new ArrayIndexOutOfBoundsException();
}
E removedItem = elementData[index];
for(int i = index;i < size()-1;i++){
elementData[i] = elementData[i+1];
}
size--;
return removedItem;
}
3.5 claer方法
public void clear() {
//清除所有元素
for (int i = 0; i < size; i++){
elementData[i] = null;
}
size = 0;
}
3.6 toArray方法
public void toArray() {
for(int i=0;i<size;i++){
System.out.println(elementData[i]+" ");
}
}
trimToSize这个方法将ArrayList的动态增加的容量变成了实际容量。
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
ensureCapacity这个方法可以手动进行扩容ArrayList的大小,当一次放入很多数据时,可以先提前手动扩大数组容量,提高效率
public void ensureCapacity(int minCapacity) {
if (minCapacity > elementData.length
&& !(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
&& minCapacity <= DEFAULT_CAPACITY)) {
modCount++;
grow(minCapacity);
}
}
grow这个方法可以扩大ArrayList的容量
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
return elementData = Arrays.copyOf(elementData, newCapacity);
} else {
return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
}
}
isEmpty方法是判断是否ArrayList为空,为空返回True,否则返回false
public boolean isEmpty() {
return size == 0;
}
contains方法判断数组是否包含指定元素,包含则返回那个下标,否则返回-1
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
clone方法是去复制数组给指定数组,当超出数组大小时,会抛出异常
public Object clone() {
try {
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}