以ArrayList为例,其clear()的具体实现为遍历每一个元素,并将其设置为null。
public void clear() {modCount++;final Object[] es = elementData;for (int to = size, i = size = 0; i < to; i++)es[i] = null;
}
笔者作为初学者,很难不产生疑惑,为什么不将size直接设置为0。当向容器中添加新元素时,只需让新元素覆盖原本的元素就好了,这样不是更高效吗?并且由于存在Java垃圾回收机制,我们也无需考虑被覆盖元素的回收问题。
笔者思考了一下,得出以下见解:
在实际应用场合中,我们不能保证每一次清空后,立即会有新元素添加进来。如果只是将size置为0,那么没有被覆盖的元素的引用依然存在,仍然占用内存空间,尤其当原本容器元素数量特别多的时候,会造成大量的内存泄露。因此,在便有如上clear()的实现。
其优点在于:没有内存泄漏问题;
缺点在于:要遍历整个容器,效率不高。