/**
*删除指定元素o,分为两种情况,若指定元素o为null,则遍历当前的elementData数组,如果某一个下标index上面的值为null(==),则调用方法fastRemove(int)快速删除该元素,然后返回true
*若指定元素o不为0,则遍历elementData数组,若某一个下标index处的元素和指定元素o 进行equals 为true的话,则调用fastRemove(int)快速删除该元素,然后返回true
*由下面的源码可知,只能删除第一个匹配的元素。
*/
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
/**
*快速删除指定下标index的元素,不做边界检查(该方法时private的)
*/
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
//里面进行了数组元素的移动,将index后面的元素往前复制一位
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//将数组elementData中最后一个位置置为null,以便释放已用,让gc 回收
elementData[--size] = null; // Let gc do its work
}
/**
*删除指定下标index处的元素,该方法相比remove(Object o)方法,多了一个边界检查,但是少了元素的查找过程,因此性能更好一些。
*/
public E remove(int index) {
//对入参index做边界检查
RangeCheck(index);
modCount++;
//取出index位置的元素
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
//进行数组元素的移动
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
//返回原来index位置的旧元素
return oldValue;
}
元素的搜索:
/**
*获取指定下标index处的元素,先进行边界检查,然后直接返回elementData数组中对应位置index处的元素。
*/
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
/**
*判断集合中是否包含指定元素o,调用indexOf(Object o)方法实现
*/
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
/**
*返回指定元素o在数组elementData首次出现的下标,这里也是分为两种情况:
*1.指定元素o为null 2.指定元素o不为null,在查询元素的过程中,o为null,使用 == 比较,o不为null,使用equals比较,若找到了该元素,则返回其在数组elementData中的下标index,若找不到这返回-1.
*/
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;
}
与indexOf(Object o)方法类似的是 lastIndexOf(Object o)方法,不同的是 后者返回的是最后一次出现指定元素o的位置下标。
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size-1; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = size-1; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
我们再看一下ArrayList的迭代器方法如何实现的:
/**
*该方法是有ArrayList的父类AbstractList持有的,返回的是一个Itr对象
*/
public Iterator<E> iterator() {
return new Itr();
}
我们看看Itr是个什么鬼: