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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.util.HashSet;
  2. class Man
  3. {
  4.   public String name;
  5.   public int age;
  6.   public Man(String n, int a)
  7.   {
  8.         name = n;
  9.         age = a;
  10.   }  
  11.    
  12.   public int hashCode()
  13.   {
  14.                 return name.hashCode() + age;
  15.   }
  16.    
  17.   public boolean equals(Object o)
  18.   {
  19.   boolean result = false;
  20.   
  21.   if (o == null)
  22.         result = false;
  23.   
  24.   if (o instanceof Man)
  25.         {
  26.          Man s = (Man)o;
  27.      if ((s.age == this.age) && s.name.equals(this.name))
  28.          result = true;
  29.     }  
  30.     return result;
  31.   }
  32. }
  33. public class TestHashCode  
  34. {
  35.   public static void main(String args[])
  36.   {
  37.         HashSet<Man> hs = new HashSet<Man>();
  38.   
  39.         Man m1 = new Man("Jimmy", 27);
  40.         Man m2 = new Man("Jimmy", 28);
  41.         Man m3 = new Man("Jimmy", 29);
  42.   
  43.         hs.add(m1);
  44.         hs.add(m2);
  45.         hs.add(m3);
  46.   
  47.         for (Man m: hs)
  48.         System.out.println(m.name + ":" + m.age);   
  49.           
  50.         m1.age = 30;
  51.         m2.age = 30;
  52.         m3.age = 30;
  53.           
  54.         hs.remove(m1);
  55.                
  56.           for (Man m: hs)
  57.           {
  58.                 System.out.println(m.name + ":" + m.age);
  59.           }  
  60.   }
  61. }   
复制代码
输出结果:
Jimmy:27
Jimmy:28
Jimmy:29
Jimmy:30
Jimmy:30
Jimmy:30
结果让我有点费解。
HashSet在存储element之前,需要检查唯一性。但加入以后,却又可以被修改。
如上面,我如果修改了内容是的这些元素变成相同了,hashset会马上检查吗
但是按照上面的,我去remove,为什么一个也不成功呢?

1 个回复

倒序浏览
如下图,没改变元素年龄前,移除成功,当改名元素年龄以后,原来的元素hash code已经改变,系统找不到原来的元素了,所以移除失败,这也就是所谓的内存泄漏

QQ截图20120602232853.png (16.96 KB, 下载次数: 10)

QQ截图20120602232853.png

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

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