francistao / LearningNotes

Enjoy Learning.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

java中的内存泄漏 中说明有问题

ganshenml opened this issue · comments

2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。

public static void main(String[] args)
{
Set<Person> set = new HashSet<Person>();
Person p1 = new Person("唐僧","pwd1",25);
Person p2 = new Person("孙悟空","pwd2",26);
Person p3 = new Person("猪八戒","pwd3",27);
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:3 个元素!
**p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变

set.remove(p3); //此时remove不掉,造成内存泄漏**

set.add(p3); //重新添加,居然添加成功
System.out.println("总共有:"+set.size()+" 个元素!"); //结果:总共有:4 个元素!
for (Person person : set)
{
System.out.println(person);
}
}

==============================
以上:
p3.setAge(2); //修改p3的年龄,此时p3元素对应的hashcode值发生改变
set.remove(p3); //此时remove不掉,造成内存泄漏

这两句的注释是错误的,修改p3的年龄并不会让p3对应的hashcode值发生变化;set.remove(p3); 也是可以从set中删除掉p3对象的。

以上代码的意思应该是让Person的年龄值参与了hashCode值计算,因此改变年龄值会改变P3的hashCode值,同时因为hashCode值改变,定位不到原来的P3对象,也就删除不掉P3。