假设我有以下 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/