黑马程序员技术交流社区
标题:
HashSet中remove方法的一些问题,求高手指点?
[打印本页]
作者:
杨海波
时间:
2012-6-2 23:12
标题:
HashSet中remove方法的一些问题,求高手指点?
import java.util.HashSet;
class Man
{
public String name;
public int age;
public Man(String n, int a)
{
name = n;
age = a;
}
public int hashCode()
{
return name.hashCode() + age;
}
public boolean equals(Object o)
{
boolean result = false;
if (o == null)
result = false;
if (o instanceof Man)
{
Man s = (Man)o;
if ((s.age == this.age) && s.name.equals(this.name))
result = true;
}
return result;
}
}
public class TestHashCode
{
public static void main(String args[])
{
HashSet<Man> hs = new HashSet<Man>();
Man m1 = new Man("Jimmy", 27);
Man m2 = new Man("Jimmy", 28);
Man m3 = new Man("Jimmy", 29);
hs.add(m1);
hs.add(m2);
hs.add(m3);
for (Man m: hs)
System.out.println(m.name + ":" + m.age);
m1.age = 30;
m2.age = 30;
m3.age = 30;
hs.remove(m1);
for (Man m: hs)
{
System.out.println(m.name + ":" + m.age);
}
}
}
复制代码
输出结果:
Jimmy:27
Jimmy:28
Jimmy:29
Jimmy:30
Jimmy:30
Jimmy:30
结果让我有点费解。
HashSet在存储element之前,需要检查唯一性。但加入以后,却又可以被修改。
如上面,我如果修改了内容是的这些元素变成相同了,hashset会马上检查吗
但是按照上面的,我去remove,为什么一个也不成功呢?
作者:
黑马11期李项京
时间:
2012-6-2 23:31
如下图,没改变元素年龄前,移除成功,当改名元素年龄以后,原来的元素hash code已经改变,系统找不到原来的元素了,所以移除失败,这也就是所谓的内存泄漏
QQ截图20120602232853.png
(16.96 KB, 下载次数: 12)
下载附件
2012-6-2 23:29 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2