有没有办法在不调用垃圾收集或增加堆大小的情况下执行以下操作以避免最终GC?
List<Long> someList = new ArrayList<Long>();
someList.add(1l);
someList = new ArrayList<Long>(); //Will this cause GC of the old `someList`?
所以我问的是原来的ArrayList
是否会被删除(最终是GCd)?如果是这样,我该如何解决这个问题,以便我可以在没有GCing的情况下覆盖原始列表?
答案 0 :(得分:5)
使用ArrayList.clear();而不是创建新的ArrayList
someList.clear();
答案 1 :(得分:2)
旧版ArrayList
将有资格在第3行进行垃圾回收,前提是没有其他引用指向它,因为这里似乎就是这种情况。但是,不能保证立即进行GC。
如果您想避免额外创建ArrayList
,可以使用List#clear()
方法清除它:
someList.clear();
答案 2 :(得分:0)
我假设你的问题想要保留对旧列表的引用(以及它的内容,否则重点是什么)?
如果是这样,那么在重新分配之前只需添加一个引用:
List<Long> someList = new ArrayList<Long>();
someList.add(1L);
List<Long> oldList = someList;
someList = new ArrayList<Long>();