有 Java 编程相关的问题?

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

java不支持ArrayList。clear()方法释放内存?

如果我没有弄错的话,ArrayList包含存储添加到列表中的变量的内存位置的值。所以,我的假设是,当你调用ArrayList时。clear()方法它只释放上述值(内存位置),但不释放这些内存位置本身。我将尝试用一个例子来说明这一点:

假设您拥有当前的内存状态:

[Memory location] (type of variable) *value*

[1000] (int) 32

[1002] (int) 12

[1003] (float) 2.5

然后将它们添加到列表myList中,因此它包含指向100010021003个内存位置的指针

当你打电话给我的时候。clear()指针将为空,但内存位置1000、1002、1003仍将包含以前给定的值。我错了吗


共 (4) 个答案

  1. # 1 楼答案

    clear仅空值支持数组元素

    public void clear() {
        modCount++;
        for (int i = 0; i < size; i++)
            elementData[i] = null;
        size = 0;
    }
    

    但是如果我们调用ArrayList.trimToSizeafter clear,支持数组将收缩

    public void trimToSize() {
        modCount++;
        int oldCapacity = elementData.length;
        if (size < oldCapacity) {
            elementData = Arrays.copyOf(elementData, size);
        }
    }
    
  2. # 2 楼答案

    您是正确的,因为内存是由垃圾收集器异步清除的,而不是直接由此类库函数清除的clear只会null将它们全部清除,并相应地更新ArrayList状态

    如果这些元素中的任何一个或所有元素没有被代码的任何其他部分引用,那么它们就有资格进行垃圾收集,并且可能在调用后不久到时间结束的任何时间被销毁+取消分配

  3. # 3 楼答案

    不,它不会清除记忆。在你之后clear()

    请参阅clear()的源代码

     public void More ...clear() {
        modCount++;
    
        // Let gc do its work
        for (int i = 0; i < size; i++)
           elementData[i] = null;   
           size = 0;
        }
    

    该方法使元素符合垃圾收集器的条件。没有立即清理它们。一旦GC运行,它们就消失了

  4. # 4 楼答案

    你问题的答案是,它不会占用内存。它只会删除所有object references。现在garbage收集器可以收集这些对象,也可以不收集,这取决于它们在其他位置的引用方式

    比如说,

    Object 1 refers - > Object 2
    ArrayList refers - > Object 2
    ArrayList refers - > Object 3
    

    在这种情况下,在Arraylist.clear()之后,对象3将符合clean-up的条件,但不符合对象2的条件