java 释放数组_java集合ArrayList中clear方法内存释放分析
最近在看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方法内存释放分析相关推荐
- java list 内存释放_java集合ArrayList中clear方法内存释放分析
最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下: public void clear() { modCount++; // clear to let GC do ...
- java 创建集合类数组_Java集合 -- ArrayList集合及应用
JAVA集合 对象数组 集合类之ArrayList 学生管理系统 斗地主案例 NO.one 对象数组 1.1 对象数组描述 A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3, ...
- Java ArrayList中retainAll()方法具有什么功能呢?
转自: Java ArrayList中retainAll()方法具有什么功能呢? 下文笔者讲述java中ArrayList方法的功能简介说明,如下所示: retainAll()方法的功能:用于保留 a ...
- java 动态数组_Java动态数组的用法详解
Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayL ...
- ArrayList中contain方法
详述ArrayList中contains方法 JDK源码: //contains方法 public boolean contains(Object o) {return indexOf(o) > ...
- 深入java并发包源码(三)AQS独占方法源码分析
深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...
- java 映射数组_Java中的数组,列表,集合,映射,元组,记录文字
java 映射数组 有时,当我对JavaScript的强大功能和表现力感到兴奋时,我发现自己错过了Java世界中的一两个功能. 除了lambda表达式/闭包或任何您想称为"匿名函数" ...
- java list原理_Java集合:ArrayList的实现原理
目录: 一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单 ...
- java的集合和数组_Java集合和数组的区别
Java集合和数组的区别 集合和容器都是Java中的容器. 区别 数组特点:大小固定,只能存储相同数据类型的数据 集合特点:大小可动态扩展,可以存储各种类型的数据 转换 数组转换为集合: Arrays ...
最新文章
- A Context-aware Attention Network for Interactive Question Answering--阅读笔记
- Ubuntu 16.04下部署Graylog日志服务器
- mysql gone away 测试_python测试开发django-58.MySQL server has gone away错误的解决办法
- 【书单】matlab 科学计算、数值分析以及数学物理问题
- node.js编程错误记录集
- 等高线地图_高中地理——每日讲1题(北美洲的气候、等高线的阅读)
- python 实现注册、登录功能
- swagger入门和实践(含docker部署swagger)
- Linux下用Java获取本机IP
- paip.ajax没有起作用,提示 no transport
- 内外网怎么同时使用?保姆级教程
- ROS串口通信协议解析
- C#获取SharePoint列表数据
- 虚拟服务器无法获取ip地址,VMware下网络模式配置与IP地址无法正常获取及解决方案...
- 阿里云华北1235、华东1、华东2和华南1分别对应哪些城市?地域节点物理数据中心在哪?...
- Python hasattr()
- mysql怎么建只读账号报错_如何创建只读MySQL用户?
- 如何批量制作倒序的流水号条形码
- 这些函数简直是屌爆了
- 【智能物流】河南烟草:新网络模式下的物流系统优化
热门文章
- python数据分析函数大全_python中数据分析常用函数整理
- html5情人节贺卡,Web工程师的情人节卡片
- c语言include math.h,在C语言中,若需调用数学类库函数第数据进行处理,则需包含头文件______. 答案:math.h;#includemath.h;math.h;“math....
- 递归算法1加到100_五种循环方法计算1加到100
- MySQL查询语句转postGRE语句_PostgreSQL DBA常用SQL查询语句
- MySql 创建utf-8格式的数据库
- sqlserver 微信 读取_Sql Server使用链接服务器远程取数据_sqlserver
- 计算机环境安全服务未启动,windows10系统卡在“准备安全选项”如何解决
- java高效写文件_java如何高效读写10G以上大文件
- C++基础03-C++对c的拓展-函数