由于Java具备自动的垃圾回收机制,当我们使用完对象之后,它们会被自动回收,是不是我们在Java程序中不需要再考虑内存管理了吗?答案是否定的,下边看如下例子:
class Stack {
private Object[] elements;
// 初始化角标
int index = 0;
// 默认初始化容量
private int initialCapacity = 10;
public Stack() {
elements = new Object[initialCapacity];
}
// 压栈 push
public void push(Object e) {
ensureCapacity();
elements[index++] = e;
// System.out.println(index);
}
// 弹栈 pop
public Object pop() {
if (index == 0) {
throw new RuntimeException("没有元素");
}
return elements[--index];
}
private void ensureCapacity() {
if (index == elements.length) {
elements = Arrays.copyOf(elements, index * 2 + 1);
}
}
}
注意:从栈中弹出的对象不会作为垃圾回收,即使程序不再使用这些对象,因为栈内部继续维护着这些对象.最终可能会导致内存占用的不断增加,程序性能降低.这就是内存泄漏。
下边出栈部分做一定的改进,具体代码如下。
class Stack {
private Object[] elements;
// 初始化角标
int index = 0;
// 默认初始化容量
private int initialCapacity = 10;
public Stack() {
elements = new Object[initialCapacity];
}
// 压栈 push
public void push(Object e) {
ensureCapacity();
elements[index++] = e;
// System.out.println(index);
}
// 弹栈 pop
public Object pop() {
if (index == 0) {
throw new RuntimeException("没有元素");
}
Object obj = elements[--index];
elements[index] = null;//确保GC执行其工作。
return obj;
}
private void ensureCapacity() {
if (index == elements.length) {
elements = Arrays.copyOf(elements, index * 2 + 1);
}
}
}