class Stack{
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack(){
this.elements = new Object[DEFAULT_INITIAL_CAPACITY];
}
public void push(Object e){
ensureCapacity();
elements[size++] = e;
}
public Object pop(){
if(size == 0){
throw new EmptyStackException();
}
Object result = elements[--size];
return result;
}
private void ensureCapacity() {
if(elements.length == size){
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}
}
上面是创建栈的简单的做法,实现了入栈,出栈,和扩容功能
上面的代码,怎么看,貌似都没有问题。而且也可以利用我们创建的栈,实现所有的功能。但是在出栈的代码中存在了一个问题,在极端的情况下会发生OutOfMemoryError错误。
原因是因为从栈弹出来的对象不会被垃圾机制回收。即使不会发生错误,如果长期运行,也会对性能存在影响。
有效的解决办法是
public Object pop(){
if(size == 0){
throw new EmptyStackException();
}
Object result = elements[--size];
elements[size] = null;
return result;
}
那么实际开发中也要注意这类情况,在对象没有clear方法时,应该及时清空对象