// Can you spot the "memory leak"? public class Stack { PRivate Object[] elements; private int size = 0;
public Stack(int initialCapacity) { this.elements = new Object[initialCapacity]; }
public void push(Object e) { ensureCapacity(); elements[size++] = e; }
public Object pop() { if (size==0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = null; // Eliminate obsolete reference return result; }
/** * 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) { Object[] oldElements = elements; elements = new Object[2 * elements.length + 1]; System.arraycopy(oldElements, 0, elements, 0, size); } }
public static void main(String[] args) { Stack s = new Stack(0); for (int i=0; i<args.length; i++) s.push(args[i]); for (int i=0; i<args.length; i++) System.out.println(s.pop()); } }
總結:在擁有自動垃圾收集功能的語言里,我們要非凡注重內存治理的問題,因為這個時候內存的溢出問題不會象c plus plus這些那么明顯。我們要防范于未然。另外,根據的經驗,inputstreamreader等文件讀寫類,我們要在set 他們為null的之前,close他們的連接,即調用in.close().然后再in=null;(這里in是一個inputstreamreader等)。