java - 通过创建一个新数组并确保没有发生内存泄漏来扩展 Java 数组

标签 java arrays memory-leaks null 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);
    }
}

我的问题是关于 ensureCapacity 方法和 Arrays.copyOf JDK 方法:我们如何确定旧的 elements 数组对象因为 copyOf 似乎正在创建一个新的数组对象,所以可以进行垃圾回收吗?

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

最佳答案

“旧对象”(数组中的元素)在这一行中被复制到新数组中:

elements = Arrays.copyOf(elements, 2 * size + 1);

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

关于java - 通过创建一个新数组并确保没有发生内存泄漏来扩展 Java 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19014344/

相关文章:

java - GAE/J 范围查询中最大可能的键字符串是什么?

java - 逗号导致不必要的字符串分割

java - Java 中二维不规则数组的越界异常

c++ - 为什么我在赋值后得到不同的指针值?

java - 如何在工作台中正确使用@InverseRelationShadowVariable

java - bean 中的 @Autowired 属性构造为 MVC 方法参数

c - 冒泡排序选项。需要添加一个打印气泡位移的(print_bubble)程序

c++ - 如何正确处理垃圾收集并避免使用自定义对象指针集合的内存泄漏...?

c - 链表删除函数中,删除节点是否需要使用free?

swift - 内存泄漏与方法 NSRegularExpression.matchesInString()