黑马程序员技术交流社区
标题:
关于java加强 26讲中的内存泄露
[打印本页]
作者:
马德强
时间:
2011-12-13 15:32
标题:
关于java加强 26讲中的内存泄露
本帖最后由 马德强 于 2011-12-13 18:24 编辑
Collection c=new HashSet();
Point p1=new Point(3,3);
Point p2=new Point(3,4);
Point p3=new Point(3,5);
c.add(p1);
c.add(p2);
c.add(p3);
p1.y=6;
c.remove(p1);
for(Iterator it=c.iterator();it.hasNext();)
{
System.out.println(it.next());
}
如果修改了 参与hashCode计算的y 值,就会导致修改后的p1.hashCode() 与修改前的hashCode() 值不一致。
这样就无法对p1进行删除操作 而造成内存泄露。
但是 仍然可以通过 Point temp =new Point(3,3); c.remove(temp); 来删除p1。遍历也没有问题。
这种情况算内存泄露吗?内存泄露到底指什么?
作者:
李振元
时间:
2011-12-13 17:10
1、 hashcode方法是相对hashset集合而言的
只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要要求覆盖hashcode方法。
一般hashcode方法和equals方法要被同时覆盖,hashcode的值是根据equals方法判断的。
2、当一个对象被存储进hashset集合以后,就不能再修改对象中的那些参与计算哈希算法的那些字段,否则会造成内存泄露。
就像楼主的程序一样,表面上程序代码在不断增加对象,删除p1,但实际内存中并没有删除,
该对象以后不再用了,可是内存中却一直存在,造成浪费,最终导致内存泄露。
3、内存泄露有两种:1 为对象分配资源后,对象不在使用,但是所占用的资源未释放 2 系统想要释放资源,但是找不到原来的对象。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2