从面试角度聊聊 ArrayList 中的 remove 方法
Posted 小羊子说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从面试角度聊聊 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
VSLinkedList
-
如何自定义一个
ArrayList
ArrayList的研究有时间可以再深入了解一下。网上的文章已经很多,在此不在赘述。旨在加深自我认知,上述大家如有疑问,欢迎PK。
参考资料:
以上是关于从面试角度聊聊 ArrayList 中的 remove 方法的主要内容,如果未能解决你的问题,请参考以下文章
面试必备透过源码角度一步一步带你分析 ArrayList 扩容机制