Java中的ArrayList的remove(Object obj)方法浅析

今天改了一个bug,发现原来是原来程序员写的equals方法有点问题,实在问题很多。

顺便看了一下ArrayList的remove(Object obj)方法,不妨来看一下,以下是remove方法:

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;
}


这段的remove方法特有意思,竟然也能够擦除list中值为null的元素!测试代码如下:

import java.util.ArrayList;

public class TestListNullRemove {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<String>();
list.add("s1");
list.add("s2");
list.add(null);
list.add("s3");
list.add("s4");

System.out.println("before remove list size:"+list.size());
for(Object obj:list)
System.out.println(obj);
System.out.println();

list.remove(null);

System.out.println("after remove list size:"+list.size());
for(Object obj:list)
System.out.println(obj);
}
}



当然当传进来的元素不为null时,首先调用的是元素的equals方法,相等时才能调用fastRemove方法。
接下来remove方法主要调用了fastRemove方法,那么fastRemove方法又做了什么呢?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; // Let gc do its work
}


可以看出来,ArrayList用了一个数组(ArrayList吗,呵呵)保存值引用,不过这段代码牛B的地方有两处,一是直接将要移动的元素后面的元素直接用数组拷贝前移(保持元素的连续性),另一处是最后一行代码:
 elementData[--size] = null;
这段代码的作用是将元素引用置为null,这样做的目的是避免内存泄漏(否则实际上数组中依然有该引用,gc无法进行垃圾回收,类似Java中堆栈数据结构的实现方式),perfect!

应该说Java的类库是一座大宝藏,但如果自己时候功力不够的话,代码虽然能看得懂,但不一定能懂得妙处,自己浸淫好久了,现在对类库体会越来越深了,hehe!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值