有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java没有子列表(从、到)。clear()是否允许对ArrayList的已清除部分进行垃圾收集?

在Java中,当有一些非空的ArrayList时

list.sublist(from,to).clear()

编辑(重构问题):

减小ArrayList的内部大小(即让ArrayList在以后使用更少的内存)

我特别感兴趣的是from=0的情况,即列表从开始到某个项目都被清除。如果列表中有任何索引(不仅仅是第一个),trimToSize()也可以工作吗


共 (4) 个答案

  1. # 1 楼答案

    Does sublist(from,to).clear() allow garbage collection of the cleared part of an ArrayList?

    是的,如果你得到一个子列表并清除它,你将从原始列表中删除子列表中的所有元素

    换句话说,如果列表是唯一一个存储对对象引用的列表,您删除的对象符合垃圾收集的条件

    基本演示:

    List<String> strings = new ArrayList<String>();
    strings.add("one");
    strings.add("two");
    strings.add("three");
    strings.add("four");
    
    System.out.println(strings);   // prints [one, two, three, four]
    
    strings.subList(1, 3).clear();
    
    System.out.println(strings);   // prints [one, four]
    
  2. # 2 楼答案

    没用过?返回的列表是原始列表的视图。如果修改其中一个,更改可能会在另一个上可见

  3. # 3 楼答案

    “清除”是在底层本机数组(对象[])中重新定位对象,但不会调整数组的大小。如果要在删除ArrayList中的某些项后减小数组大小,请使用trimToSize()方法

    数组中未使用的元素引用被设置为null,因此可以对元素进行垃圾收集

  4. # 4 楼答案

    清除子列表时,与删除这些条目相同,因此可以对所有条目进行GCD(较少在其他地方引用)

    托管内存对象的全部意义在于,您不需要担心如何以及何时清理它们。除非你知道你有问题,否则我不会担心的。在这种情况下,我会使用内存分析器来确定为什么对象会被保留,而你认为它们不应该被保留