第6条:消除过期对象的引用

170 阅读1分钟
public class Stack {
    private Object[] elements;
    private int size;
    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];
    }

    private void ensureCapacity() {
        if (elements.length==size){
            elements = Arrays.copyOf(elements,2*size+1);
        }
    }

}

以上的代码存在内存泄漏,当Stack的size先增大后减小时,一些不用的对象就会常驻内存。 修改后


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