java清空堆栈中的某个元素

来源:互联网 发布:linux mysql命令大全 编辑:程序博客网 时间:2024/06/05 15:57

并不是彻底把它从数组中拿掉,而是把存储的总数减少,本人写得可以比这个好,在拿掉某个元素时,顺便也让它从数组中消失,将那个元素所在的位置的值设置为null即可.

public class Stack {    private Object[] elements=new Object[10];    private int size = 0;    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){    Object[] oldElements = elements;    elements = new Object[2 * elements.length+1];    System.arraycopy(oldElements,0, elements, 0, size);    }    }    }


 

上面的原理应该很简单,假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件:无用,无法回收。

   但是就是存在这样的东西也不一定会导致什么样的后果,如果这个堆栈用的比较少,也就浪费了几个K内存而已,反正我们的内存都上G了,哪里会有什么影响,再说这个东西很快就会被回收的,有什么关系。下面看两个例子。

例子1

 public class Bad{    public static Stack s=Stack();    static{    s.push(new Object());    s.pop(); //这里有一个对象发生内存泄露    s.push(new Object()); //上面的对象可以被回收了,等于是自愈了    }    }


 

因为是static,就一直存在到程序退出,但是我们也可以看到它有自愈功能,就是说如果你的Stack最多有100个对象,那么最多也就只有100个对象无法被回收其实这个应该很容易理解,Stack内部持有100个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,以前的引用自然消失!

 

内存泄露的另外一种情况:当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄露。