问:简单解释下你对 ArrayList.clear() 与 null 及 new ArrayList<E>() 赋值方式的理解?
答:
- 使用 ArrayList 对象的
clear()
方法一般写法如下:
ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list.clear();
上面的方式其实是因为 ArrayList 对象内部维护了一个对象数组 elementData,当执行 clear()
方法时,会执行循环将 elementData 中每一个元素都设置为 null,并设置数组的 size 为 0,是对 ArrayList 容器的一种清空释放,但是 ArrayList 对象还在。
- 使用
list = null
的一般写法如下:
ArrayList<String> list = new ArrayList<String>();
list.add("0");
list.add("1");
list.add("2");
list = null;
上面的方式直接将变量 list 指向 null,通常当我们不需要再使用 ArrayList 对象时可以将变量值设为 null,以便 GC 可以运作并回收这部分内存空间。不过,需要注意的是当:仍有其他变量指向该对象时,即使讲变量 list 置为 null,垃圾回收器也无法回收该内存空间。如下:
ArrayList<String> list = new ArrayList<String>();
ArrayList<String> arraylist = list;
list.add("0");
list.add("1");
list.add("2");
list = null; // 此时list变量指向null,而arraylist变量仍然指向原内存空间,原内存空间得不到释放
- 使用
list = new ArrayList()
方式有点类似于最上面的方式,都是得到一个空的 ArrayList 对象。不过new ArrayList()
会得到一个初始化内部数组 elementData 容量为 10 的 ArrayList 对象,且会在内存中重新开辟内存空间,开销较大,如果只是单纯的想要使用空的 ArrayList 对象,建议直接clear()
,相对来说可尽量避免堆内存溢出问题。
本文参考自 关于 ArrayList.clear() 与 null 及 new ArrayList<E>() 的一道笔试题
网友评论