先要明白一個概念是在你使用完某個對象之後,對象處於未被引用的狀態,此時就會被回收。
public class Stack{
private Object[] elements;
private int size=0;
private static final int DEFALUT_INITIAL_CAPACITY=16;
public Stack(){
elements=new Object[DEFALUT_INITIAL_CAPACITY];
}
public void push(Object o){
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);
}
}
}
在上述代碼中如果棧如果是先擴大,然後再縮小的情況下,會造成從棧中彈出的對象將不會被垃圾回收,即使你不在引用這些對象。它們不會被回收的 原因是因爲棧內部維護着對這些對象的過期引用。此時的對象永遠不會被接觸引用,如果有大量的過期引用對象,將會對系統造成過大的不必要的負擔。
解決的辦法如下:在pop方法中
Object result=elements[--size];
elements[size]=null;//消除引用,結束變量的生命週期