通过创建新数组并确保不发生内存泄漏来增长java数组

bal*_*teo 1 java arrays null memory-leaks new-operator

假设我有以下Stack课程(取自Joshua Bloch的Effective Java):

import java.util.Arrays;

public class Stack {
    private Object[] elements;
    private int size = 0;
    private static final int DEFAULT_INITIAL_CAPACITY = 16;

    public Stack() {
        elements = new Object[DEFAULT_INITIAL_CAPACITY];
    }

    public void push(Object e) {
        ensureCapacity();
        elements[size++] = e;
    }

    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }

    /**
     * Ensure space for at least one more element, roughly doubling the capacity
     * each time the array needs to grow.
     */
    private void ensureCapacity() {
        if (elements.length == size)
            elements = Arrays.copyOf(elements, 2 * size + 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是关于ensureCapacity方法和Arrays.copyOfJDK方法:我们怎么能肯定旧的elements数组对象可以被垃圾收集,因为copyOf似乎是在创建一个新的数组对象?

换句话说,如果每次ensureCapacity调用都创建一个新对象,那么旧对象去哪里并且没有内存泄漏的风险?

Ósc*_*pez 5

"旧对象"(数组中的元素)将被复制到此行中的新数组中:

elements = Arrays.copyOf(elements, 2 * size + 1);
Run Code Online (Sandbox Code Playgroud)

至于旧elements数组,它最终会被垃圾收集,因为没有更多的引用指向它.