最近在看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;

}

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

如下代码:

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

实例:https://blog.csdn.net/china199225/article/details/52795771

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

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

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

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

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

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

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

  4. java 动态数组_Java动态数组的用法详解

    Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayL ...

  5. ArrayList中contain方法

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

  6. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  7. java 映射数组_Java中的数组,列表,集合,映射,元组,记录文字

    java 映射数组 有时,当我对JavaScript的强大功能和表现力感到兴奋时,我发现自己错过了Java世界中的一两个功能. 除了lambda表达式/闭包或任何您想称为"匿名函数" ...

  8. java list原理_Java集合:ArrayList的实现原理

    目录: 一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单 ...

  9. java的集合和数组_Java集合和数组的区别

    Java集合和数组的区别 集合和容器都是Java中的容器. 区别 数组特点:大小固定,只能存储相同数据类型的数据 集合特点:大小可动态扩展,可以存储各种类型的数据 转换 数组转换为集合: Arrays ...

最新文章

  1. A Context-aware Attention Network for Interactive Question Answering--阅读笔记
  2. Ubuntu 16.04下部署Graylog日志服务器
  3. mysql gone away 测试_python测试开发django-58.MySQL server has gone away错误的解决办法
  4. 【书单】matlab 科学计算、数值分析以及数学物理问题
  5. node.js编程错误记录集
  6. 等高线地图_高中地理——每日讲1题(北美洲的气候、等高线的阅读)
  7. python 实现注册、登录功能
  8. swagger入门和实践(含docker部署swagger)
  9. Linux下用Java获取本机IP
  10. paip.ajax没有起作用,提示 no transport
  11. 内外网怎么同时使用?保姆级教程
  12. ROS串口通信协议解析
  13. C#获取SharePoint列表数据
  14. 虚拟服务器无法获取ip地址,VMware下网络模式配置与IP地址无法正常获取及解决方案...
  15. 阿里云华北1235、华东1、华东2和华南1分别对应哪些城市?地域节点物理数据中心在哪?...
  16. Python hasattr()
  17. mysql怎么建只读账号报错_如何创建只读MySQL用户?
  18. 如何批量制作倒序的流水号条形码
  19. 这些函数简直是屌爆了
  20. 【智能物流】河南烟草:新网络模式下的物流系统优化

热门文章

  1. python数据分析函数大全_python中数据分析常用函数整理
  2. html5情人节贺卡,Web工程师的情人节卡片
  3. c语言include math.h,在C语言中,若需调用数学类库函数第数据进行处理,则需包含头文件______. 答案:math.h;#includemath.h;math.h;“math....
  4. 递归算法1加到100_五种循环方法计算1加到100
  5. MySQL查询语句转postGRE语句_PostgreSQL DBA常用SQL查询语句
  6. MySql 创建utf-8格式的数据库
  7. sqlserver 微信 读取_Sql Server使用链接服务器远程取数据_sqlserver
  8. 计算机环境安全服务未启动,windows10系统卡在“准备安全选项”如何解决
  9. java高效写文件_java如何高效读写10G以上大文件
  10. C++基础03-C++对c的拓展-函数