java ArrayList中的remove方法介绍
先看一段代码,看看自定义的ArrayList中的remove设计是否有问题。
public class MyArrayList { private Object[] mData = new Object[0]; private int mSize = 0; // 删除第i个元素 public void remove(int i) { if (i < 0 || i >= mSize) return; for (int index = i; index < mSize - 1; index++) { mData[index] = mData[index + 1]; } --mSize; } // ... 其他方法略 }
走进源码:
针对remove,有两种方式实现
(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); elementData[--size] = null; // clear to let GC do its work return oldValue; }
实现步骤:
检查所要移除的位置是否落在数组元素长度之内。
修改次数+1把需要删除的元素赋给oldValue,一遍方法返回旧元素numMoved计算出的是删除元素后需要移动的元素数。
当numMoved>0 说明删除元素后需要把后面的元素往前移动。
当numMoved<0 时,说明删除的元素为最后一个元素。
直接把最后一个位置置空。(分析重点:将最后的位置要设置为空,让垃圾回收器回收 ,防止对象游离)返回被删值
(2)根据内容删
参考资料:
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; }
其中的fastRemove,代码如下:
private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work }
实现步骤:
因为对象是否相等需要使用equals方法,但是空对象不能使用equals方法比较。
因此需要先判断传入的对象是否为空。
为空时 使用==来寻找数组中空对象并删除。不为空时,便使用equals遍历寻找来删除相应对象。
OK,ArrayList的第一阶段的研究到此结束,针对开头的问题,已经找到了答案。
remove的设计有问题,–mSize;之后需要把mData[–mSize]=null;让垃圾回收器回收 ,防止对象游离。
未来有时间的研究方向大概如下,
ArrayList
VS LinkedList
如何自定义一个ArrayList
ArrayList的研究有时间可以再深入了解一下。网上的文章已经很多,在此不在赘述。旨在加深自我认知,上述大家如有疑问,欢迎PK。
到此这篇关于java ArrayList中的remove方法介绍的文章就介绍到这了,更多相关java ArrayList中的remove内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java使用elasticsearch分组进行聚合查询过程解析
这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-02-02Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】
这篇文章主要介绍了Java设计模式之工厂模式,结合实例形式分析了简单工厂、工厂方法、抽象工厂等相关功能、实现与使用方法,需要的朋友可以参考下2018-04-04
最新评论