最近在看ArrayList源码的时候看到了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;

}

在看到这段代码的时候联想到内存释放的问题

如下代码:

ListlistA = new ArrayList();

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能更快完成清除内存的工作。

个人愚见,不喜勿喷

java list 内存释放_java集合ArrayList中clear方法内存释放分析相关推荐

  1. java 释放数组_java集合ArrayList中clear方法内存释放分析

    最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下: public void clear() { modCount++; // clear to let GC do ...

  2. java list 遍历效率_java使用ArrayList遍历及效率比较实例分析

    本文实例讲述了java使用ArrayList遍历及效率比较.分享给大家供大家参考.具体如下:ArrayList arrL = new ArrayList(); ArrayList arrLTmp1 = ...

  3. java 创建集合类数组_Java集合 -- ArrayList集合及应用

    JAVA集合 对象数组 集合类之ArrayList 学生管理系统 斗地主案例 NO.one 对象数组 1.1 对象数组描述 A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3, ...

  4. java list 获取索引_java – 获取arrayList中元素的索引

    我试图在arrayList minuteList中获得466的索引 [288, 318, 346, 376, 406, 436, 466, 1006, 1036, 1066, 1096, 1126, ...

  5. java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

    前两篇文章分别分析了Java的ArrayList和LinkedList实现原理,这篇文章分析下HashSet和LinkedHashSet的源码.重点讲解HashSet,因为LinkedHashSet是 ...

  6. Java ArrayList中retainAll()方法具有什么功能呢?

    转自: Java ArrayList中retainAll()方法具有什么功能呢? 下文笔者讲述java中ArrayList方法的功能简介说明,如下所示: retainAll()方法的功能:用于保留 a ...

  7. 梦魇java_[Java教程]魔鬼的梦魇—验证IE中的JS内存泄露模式(一)

    [Java教程]魔鬼的梦魇-验证IE中的JS内存泄露模式(一) 0 2012-05-08 07:00:04 随着移动互联网的发展,现在越来越多的应用开始想bs方向转移,原来很多复杂的计算逻辑也自然随着 ...

  8. ArrayList中contain方法

    详述ArrayList中contains方法 JDK源码: //contains方法 public boolean contains(Object o) {return indexOf(o) > ...

  9. 什么是内存泄漏?Chrome浏览器中怎么查看内存占用情况?

    JavaScript,会在创建变量(对象,字符串等)时分配内存,并且在不再使用它们时"自动"释放内存,这个自动释放内存的过程称为垃圾回收. 因为自动垃圾回收机制的存在,让大多Jav ...

最新文章

  1. 金邦黑金刚4G内存 VS Vista系统
  2. 智源青年科学家林乾:揭开人工智能的黑匣,从解答最基本的问题开始
  3. mongodb 安装、开启服务 和 php添加mongodb扩展
  4. apache+mod_wsgi配置
  5. FPGA SPI总线协议简介
  6. jquery各类资源整理
  7. 【C#】1.2 控制台应用程序学习要点
  8. [Eclipse经验] 如何导入XSD文件
  9. 微信小程序使用webview打开pdf文档及显示网页内容
  10. correl函数相关系数大小意义_EXCEL中的相关系数能说明什么?
  11. 华为云云享专家申请流程
  12. ipad无线怎么重新连接到服务器,iPad不能连接无线怎么办 iPad不能连接无线解决方法【详解】...
  13. 京东2017校园招聘Android研发工程师编程题(二):幸运数
  14. JAVA:实现Aliquot Sum等分总和算法(附完整源码)
  15. ensp启动设备蓝屏_戴尔笔记本蓝屏原因 戴尔笔记本蓝屏解决方法【详解】
  16. 支付宝手机网站支付详细流程步骤
  17. The requested URL was not found on the server. If you entered the URL manually please check your spe
  18. 基于深度学习的公交客流统计解决方案简介
  19. 产业成型、头雁初现:Wi-Fi 6爆发的2019
  20. 华展云能这么玩? 玩转华展云之新手入门

热门文章

  1. 你我共建python技能树,python技能树测评
  2. 三种函数指针的表达以及函数指针概念讲解
  3. linux下删除只读文件,linux – 我无法删除文件’rm:无法删除X只读文件系统’
  4. VS2012解决方案资源管理器里面突然没了七层项目
  5. MySQL数据库学习(二) MySQL数据库课后练习(1) DDL与DML练习
  6. 使用7-zip进行分卷压缩和解分卷压缩(Windows和Linux)
  7. word显示打印机服务器脱机,打印机显示脱机无法打印的原因分析和解决办法
  8. Spring:多配制信息整合
  9. C语言,进制转换之二进制转十六进制,完整代码
  10. 磁盘配额 linux,磁盘配额(quota)