关于ArrayList与vector存储问题

发布时间 2023-07-05 08:50:53作者: 子过杨梅

今天手撸项目的时候,惊然发现一个问题

全局变量:
static Vector<ArrayList> vector=new Vector<>(0);

某函数下:
vector.add(nearby_poi);
            System.out.println(vector.get(vector.size()-1).get(4));
            Thread.sleep(10000);
            nearby_poi.clear();
这样是可以完美输出的!

然而,当我改变了一下代码:
vector.add(nearby_poi);
            nearby_poi.clear();
            System.out.println(vector.get(vector.size()-1).get(4));
            Thread.sleep(10000);
然后这段傻逼代码给爷报错。。。。。
                

 

在我的细细思索之下,认为,这俩逼和数组有些不同点,会不会是他们一个存储的地址,一个存储的是值捏,妈的,我一个逼大二学生凭什么知道哇,

所以哥们直接他妈的去ci si de ne上find find,一搜之下果然不出哥们所料,原来是他妈的这样:

在ArrayList中底层数组是Object类型,数组中存储的并不是数据本身,而是数据的引用,那么现在在看clear的方法

 

方法中将数组元素清空设置为null,即清除了对所有元素的引用,那么系统在gc的时候会将所有的元素清除,释放元素所占用的内存空间。但是此时并没有释放系统分配给elementData数组的空间。

拿到解决方案哥们欣喜若狂,直呼问题迎刃而解,如宝剑吹啥玩意断发,真实一泄如注,一心一意,一生一世,一二三四。

问题不大!

但是!问题来了,

问题是找到了,这该怎么去解决呢,哥们挠头,不用list也不行,现在是8:38,让哥们去想想解决办法。。。

只因你太美,哥们找到解决方法了,出在同一篇文章,现在是8:42,膜拜大佬!

方法中将数组元素清空设置为null,即清除了对所有元素的引用,那么系统在gc的时候会将所有的元素清除,释放元素所占用的内存空间。但是此时并没有释放系统分配给elementData数组的空间。

最后附上大佬文章:(21条消息) java集合ArrayList中clear方法内存释放分析_arraylist clear_天河~的博客-CSDN博客