A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马德强 黑马帝   /  2011-12-13 15:32  /  1688 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马德强 于 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。遍历也没有问题。

这种情况算内存泄露吗?内存泄露到底指什么?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

1 个回复

倒序浏览
1、 hashcode方法是相对hashset集合而言的
      只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要要求覆盖hashcode方法。
      一般hashcode方法和equals方法要被同时覆盖,hashcode的值是根据equals方法判断的。

2、当一个对象被存储进hashset集合以后,就不能再修改对象中的那些参与计算哈希算法的那些字段,否则会造成内存泄露。
    就像楼主的程序一样,表面上程序代码在不断增加对象,删除p1,但实际内存中并没有删除,
    该对象以后不再用了,可是内存中却一直存在,造成浪费,最终导致内存泄露。

3、内存泄露有两种:1 为对象分配资源后,对象不在使用,但是所占用的资源未释放 2 系统想要释放资源,但是找不到原来的对象。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马