1

次の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メソッドとJDK メソッドに関する私の質問です。新しい配列オブジェクトを作成しているように見えるのでArrays.copyOf、古いelements配列オブジェクトをガベージ コレクションできると断言するにはどうすればよいでしょうか。copyOf

つまり、 が呼び出されるたびに新しいオブジェクトが作成される場合ensureCapacity、古いオブジェクトはどこに移動し、メモリ リークのリスクはなくなるのでしょうか?

4

1 に答える 1

5

「古いオブジェクト」(配列内の要素) は、次の行で新しい配列にコピーされます。

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

古いelements配列に関しては、それを指す参照がもうないため、最終的にはガベージ コレクションが行われます。

于 2013-09-25T20:14:15.670 に答える