ArrayList中关于clear()

今天看ArrayList源码,发现clear方法中的清除过程如下

`public void clear() {
    modCount++;
    // clear to let GC do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;
    size = 0;
}`

不明白为什么需要遍历elementData中的每个元素并赋值为null,不能是直接elementData=null吗?

阅读 3.7k
3 个回答

咋一看起来,好像下面的方法更简单:

    modCount++;
    elementData = EMPTY_ELEMENTDATA;
    size = 0;

但是有一个原因让这种做法不可行:elementData不是私有的!

在设计上,为了效率,elementData是包可见的,会被其他类(主要是ArrayList的内部迭代器类)直接引用。如果采用上面的做法,就可能会导致迭代器与数据不一致问题。

clear方法的作用是清空集合中所有的元素,意思是还可以继续使用,不过里面没有数据了,你让elementData=null之后后面没有办法再继续操作了,会出现空指针。
遍历设置为空是为了让GC快点进行垃圾回收。

遍历每个元素赋值为null,说明这个数组的长度为0,elementData.length == 0. 但是如果直接 elementData=null,在进行条件判断时候 ,可能会出现空指针异常

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题