public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
/**
* 返回第一次出现的指定元素的索引,-1代表此元素不再集合内
*/
public int indexOf(Object o) {
//如果传入的数据是null
if (o == null) { //判断null是为了防止空指针
//遍历集合
for (int i = 0; i < size; i++)
//如果集合中存在null元素,则返回null在此集合中的位置
if (elementData==null)
return i;
} else {//如果传入的数据不是null
//遍历集合
for (int i = 0; i < size; i++)
//如果集合中存在传入的此元素,则返回此元素在集合中的位置
if (o.equals(elementData))
return i;
}
return -1;
}
/**
* 返回最后一次出现的指定元素的索引,-1代表此元素不再集合内
*/
public int lastIndexOf(Object o) {
//如果传入的数据是null
if (o == null) { //判断null是为了防止空指针
//遍历集合,从最后一个往前面遍历,目的是找到最后一次出现的指定元素的位置
for (int i = size-1; i >= 0; i--)
//如果集合中存在null元素,则返回null在此集合中的位置
if (elementData==null)
return i;
} else {//如果传入的数据不是null
//遍历集合,从最后一个往前面遍历,目的是找到最后一次出现的指定元素的位置
for (int i = size-1; i >= 0; i--)
//如果集合中存在传入的此元素,则返回此元素在集合中的位置
if (o.equals(elementData))
return i;
}
return -1;
}
/**
* 返回一个浅拷贝的ArrayList
*
*/
public Object clone() {
try {
@SuppressWarnings("unchecked")
ArrayList<E> v = (ArrayList<E>) super.clone();
//复制数组elementData到v.elementData
v.elementData = Arrays.copyOf(elementData, size);
//数组变化的次数设置为0
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
/**
* 从集合中移除下标为index的元素
*
* @param 自定义下标
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E remove(int index) {
//检查异常
rangeCheck(index);
modCount++;
//找到index的元素值
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//将最后一个元素设置为null
elementData[--size] = null; // Let gc do its work
//返回被移除的值
return oldValue;
}
/**
* 清空数组
*/
public void clear() {
modCount++;
//循环当前数组
for (int i = 0; i < size; i++)
//将数组的每一个元素都设置为null
elementData = null;
//长度设置为0
size = 0;
}
/**
* 安全措施:检查是否会发生数组下标越界异常
*/
private void rangeCheck(int index) {
//如果传入的长度大于数组的长度,则抛出异常
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
/**
* 安全措施:检查是否会发生数组下标越界异常
*/
private void rangeCheckForAdd(int index) {
//如果传入的长度大于数组的长度,或小于0则抛出异常
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
}