再一次偶然的机会,看见了list.clear() 方法(ps:很少之前很少看API,只知道常用的,之后要准备看API了),觉得奇怪,便去深入源码研究了一下clear方法的特别之处。
个人之前在循环中要么是每次new一个list集合,要么就是使 list=null,但是在大批量大数据量循环的时候,确实影响性能的开销。
ArrayList 的 clear 方法源码如下:
/**
* Removes all of the elements from this list. The list will
* be empty after this call returns.
*/
public void clear() {
modCount++;
// clear to let GC do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
我们从中可以发现就是将list集合中的所有对象都释放了,而且集合也都空了,所以我们没必要多次创建list 集合而只需要调用一下 clear() 方法就可以了。
LinkedList 的 clear 方法源码如下:
/**
* Removes all of the elements from this list.
* The list will be empty after this call returns.
*/
public void clear() {
// Clearing all of the links between nodes is "unnecessary", but:
// - helps a generational GC if the discarded nodes inhabit
// more than one generation
// - is sure to free memory even if there is a reachable Iterator
for (Node<E> x = first; x != null; ) {
Node<E> next = x.next;
x.item = null;
x.next = null;
x.prev = null;
x = next;
}
first = last = null;
size = 0;
modCount++;
}
从上面我们可以看到,不管是哪个实现类的clear 方式都是将里面的所有元素都释放了并且清空里面的属性 ,这样我们就不用在释放 创建新对象来保存内容而是可以直接将现有的集合制空再次使用。
clear的实现其实也是遍历list内数组将各个元素赋值null,让gc去回收每个元素。