在看到这段代码的时候联想到内存释放的问题
如下代码:
List<String> listA = new ArrayList<String>();
for(int i=0;i<100;i++){
listA.add(new String("arraylist"));
我创建了一个对象listA,并向listA中添加了100个元素,大家知道ArrayList的底层是数组,在创建listA之后,调用add方法之前,listA中存储数据的数组(Object[] elementData)默认是为空的elementData=null,在调用add方法之后才会初始化这个数组,并且默认长度为10(元素个数超过数组长度之后会重新创建一个数组,并将原数据复制到新数组,数组扩展系数为原来的1.5倍)。那么在调用add方法添加元素之后listA内存占用有如下两个:
1、系统为listA中数组elementData分配的内存;
2、向listA中添加元素占用的内存;
在ArrayList中底层数组是Object类型,数组中存储的并不是数据本身,而是数据的引用,那么现在在看clear的方法
public void clear() {
modCount++;
// clear to let GC do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
方法中将数组元素清空设置为null,即清除了对所有元素的引用,那么系统在gc的时候会将所有的元素清除,释放元素所占用的内存空间。但是此时并没有释放系统分配给elementData数组的空间。
个人认为这种方式没有任何问题,因为通常我们在调用clear方法清空数据之后,往往还会向listA中重新添加数据,如果在clear的时候将elementData也设置为null,那么在重新添加数据的时候如果数据量很大,那么又会涉及到因为扩展数组长度复制数据而浪费时间。所以如果listA只用一次,那么可以在调用clear之后把listA也设置为null来释放全部的内存。要看具体场合用具体的功能。
listA.clear();
listA = null;
对list使用的个人建议
1、如果能大概知道有多少个元素,那么在创建list的时候可以直接指定长度,避免因扩展长度复制数据而浪费时间,List listA = new ArrayList(100000);
2、如果集合中存储了大量的元素,并且集合已经使用完毕,那么尽量调用clear方法来及时的释放空间。如果集合不会重复使用,那么将集合也设置为null将内存一并释放。这样有助于gc能更快完成清除内存的工作。
个人愚见,不喜勿喷
从列表中移除指定 collection 中包含的其所有元素(可选操作)。
removeAll(Collection<?> c)可以传入一个Collection类型参数,意在清除当前列表中与所有传入Collection所包含的元素,...
ArrayList是常用到的JCF类,用来保存类型相同的一组对象,并通过下标来快速访问指定对象。今天讨论的是当我们使用完ArrayList后应该选择怎样合适的处理方式。
这里现在有三种方式如下:
1. 使用ArrayList的对象方法clear()
ArrayList<String> list = new ArrayList<String>();
list.ad...
很多时候为了重用我们会想要重置一个ArrayList,这里的重置是指清空列表或移除列表所有的元素。在Java中,有两个方法可以帮助我们实现重置clear或removeAll。在列表长度很小的情况下(eg:10或100个元素),可以放心的使用这两种方法。但如果列表很大(eg:10M个元素),那么选择clear还是removeAll会对你java应用的性能造成巨大的影响。甚至有时,在列表过大的情况下,...
final Object[] es = elementData;
for (int to = size, i = size = 0; i < to; i++)
es[i] = null;
clear()方法是循环list数组,将每个下标设置为null。后面我测试了一下,和重新赋值方法对比了一下,这里我创建了一个长度 10
public class Test {
public static void main(String[] args) throws InterruptedException {
ArrayList<Student> list=new ArrayList<>();
for (int i = 0; i < 10000;
ArrayList类clear()方法 (ArrayList Class clear() method)
clear() method is available in java.util package. clear()方法在java.util包中可用。 clear() method is used to delete or clear all the elements from this Ar...
废话不多说,直接上代码------------------>
String serialNo = "2118%000690;2118%000691;2118%000692;2118%000693;2118%000694;2118%000695;2118%000696;2118%000697;2118%000698;2118%000699;" +
"2118%000700;2118%000701;2118%000702;2118%00
最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下:public void clear() {modCount++;// clear to let GC do its workfor (int i = 0; i < size; i++)elementData[i] = null;size = 0;}在看到这段代码的时候联想到内存释放的问题如下代码:List...