初学ArrayList类remove方法
当前版本为jdk1.8.0_102
一、大体思路
使用时共有两种思路:
1、删除指定位置的元素
方法通过arraycopy方法将后方的元素前移实现了删除的操作
2、删除指定元素
程序遍历集合判断数组中是否有指定的元素
此时有两种情况:
a、要删除的元素引用为空
b、要删除的元素引用非空
比如元素类型为String时
a、null
b、"null"或"12asd"
二、相关程序
1、删除指定位置的元素,并返回原元素
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);
//将数组最后一位置null
//此处可以不赋值为空值,但是这样会导致内存无法正常释放。
elementData[--size] = null;
//返回原数据
return oldValue;
}
2、删除指定对象,成功返回true,失败返回false
public boolean remove(Object o) {
//要删除元素为null(指引用为空)
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++)
//当类覆盖equals方法时,其可用于判断字符串是否相等
//在自己编程时应注意要将可能为空的元素置于equals方法内,以免产生错误
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
//没有进行删除工作则返回false
return false;
}
//快速删除指定位置元素,不需返回
private void fastRemove(int index) {
//修改次数++
modCount++;
//计算要前移的格数
int numMoved = size - index - 1;
//大于0说明需要前移
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null;
}