ArrayList实现了List接口。
1. 构造方法
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2. 私有变量DEFAULTCAPACITY_EMPTY_ELEMENTDATA
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
由此可见,ArrayList实际就是一个动态数组,那么ArrayList就有动态数组的所有特性。
3. add()
add方法主要实现了两个功能,一个是动态数组扩容size+1,一个是elementData[size++] = e;
4. remove()
remove方法,for循环遍历数组,找到要remove的数据,调用System.arraycopy方法,把需要删除的数据后面的所有数据向前挪动一个位置,并把数组中最后一个对象置为null(交给GC处理),size-1,并返回true,表示处理完毕,否则返回false。
public E remove(int index) {
//判断异常
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
modCount++;
//获取旧数据
E oldValue = (E) elementData[index];
//需要挪动的位置
int numMoved = size - index - 1;
if (numMoved > 0)
//把index后面的所有数据向前挪动一个位置
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//最后一个数据设为null,并把size-1
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
5. addAll()
addAll方法是把传过来的集合整体添加到当前集合的末尾(如指定位置,则是插入该位置,该位置原数据向后移动)
6. clear()
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
所有数据置为null,并把size修改为0
7. clone()
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
克隆当前ArrayList,之前有过这种需求,自己还是重新组合的,以后也可以调用Arrays.copyOf方法了
8. contains()、indexOf()
该方法中遍历整个数组,并调用equals方法来进行比较,如果有相等的,返回下标,如果没有相等的,返回-1
9. ensureCapacity()
增加容量到指定大小
10. get()
返回数组指定位置的对象
11. isEmpty()
public boolean isEmpty() {
return size == 0;
}
如果数组的大小为0,返回true,其他情况都是false
12. iterator()
public Iterator<E> iterator() {
return new Itr();
}
该方法返回了一个Iterator对象,
13. lastIndexOf()
从数组最后一个元素开始向前遍历,返回第一个出现的索引,如果没有返回-1
14. listIterator()
public ListIterator<E> listIterator() {
return new ListItr(0);
}
返回对应ListItr对象,默认为0
15. retainAll()
删除指定集合外的所有数据,此方法的实现方法为:首先遍历整个数组,把包含的数组放在前面,每次放置记录次数w,并在最后把w之后的所有数据置为null(GC),如果调整后数组长度没有变,则返回false,如果调整之后数组长度发生了改变,返回true。
16. set()
修改指定位置的对象,并返回修改前的对象
public E set(int index, E element) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
E oldValue = (E) elementData[index];
elementData[index] = element;
return oldValue;
}
17. subList()
返回指定范围的数据,并保持和原数据的关联性。调用此方法并不会影响原数据大小。
18. toArray()
把该集合转化为数组对象。
19. trimToSize()
如果size和elementData.length不同的时候,根据size调整elementData