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集合中单独删除当前对象,造成内存泄露。
- java清空堆栈中的某个元素
- js 清空某个div中的input标签值
- Spring data JPA 清空 Couchbase 某个bucket中的数据
- sql 清空某个字段
- jquery清空元素内容
- 堆栈中的最小元素
- SDWebImage 检查某个URL 清空某个URL
- 清空datagridview中的数据
- 清空C#中的控件
- 清空Oracle10中的回收站
- 清空 DataGridView 中的内容
- 清空textbox中的内容
- 清空tomcate中的缓存
- canvas中的清空画布
- 清空数组中的空单元
- 清空JS数组中的空值
- 通过js动态清空、增加、删除、修改下拉框中的元素
- js----[转]通过js动态清空、增加、删除、修改下拉框中的元素
- 设计模式(15) ------------模板方法模式
- db2创建索引原则
- hibernate的get和load区别
- JBPM4基础篇04-设计请假流程,JBPM集成到Web Project
- opensuse开启telnet服务
- java清空堆栈中的某个元素
- 数学求解之求出现次数最多的字母和次数
- Nand Flash and Nor flash
- 在安卓中获取一个城市的天气情况
- jquery uploadify插件
- 利用dex2jar和jd-gui反编译apk文件,得到其源代码!!
- lua面向对象编程之点号与冒号的差异详细比较
- 用C实现一个简单的泛型
- 自己写java.lang.String