1.1ArrayList简介
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。但是ArrayList不是线程安全,在多线程情况建议使用Collections.synchronizedList(new ArrayList<Object>());
1.2类图
1.3成员变量分析
private static final int DEFAULT_CAPACITY =
10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* Object[]类型的数组,保存了添加到ArrayList中的元素。ArrayList的容量是该Object[]类型数组的长度
* 当第一个元素被添加时,任何空ArrayList中的elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA将会被
* 扩充到DEFAULT_CAPACITY(默认容量)。
*/
transient Object[] elementData;
private int size;
1.4构造方法
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);
}
}
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) !=
0) {
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
1.5容量相关
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size ==
0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
public void ensureCapacity(
int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
?
0
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
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 static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE -
8;
private void grow(
int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >>
1);
if (newCapacity - minCapacity <
0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE >
0)
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) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
1.6常用方法
public Object
clone() {
try {
ArrayList<?> v = (ArrayList<?>)
super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount =
0;
return v;
}
catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
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 boolean add(E e) {
ensureCapacityInternal(size +
1);
elementData[size++] = e;
return true;
}
public void add(
int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size +
1);
System.arraycopy(elementData, index, elementData, index +
1,
size - index);
elementData[index] = element;
size++;
}
public E
remove(
int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index -
1;
if (numMoved >
0)
System.arraycopy(elementData, index+
1, elementData, index,
numMoved);
elementData[--size] =
null;
return oldValue;
}
public void clear() {
modCount++;
for (
int i =
0; i < size; i++)
elementData[i] =
null;
size =
0;
}
public boolean addAll(
int index, Collection<? extends E> c) {
rangeCheckForAdd(index);
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew);
int numMoved = size - index;
if (numMoved >
0)
System.arraycopy(elementData, index, elementData, index + numNew,
numMoved);
System.arraycopy(a,
0, elementData, index, numNew);
size += numNew;
return numNew !=
0;
}
有问题或建议请联系邮箱:981017952@qq.com,qq:981017952