黑马程序员技术交流社区

标题: 你怎么看?看别人的贴,看出自己毛病了 [打印本页]

作者: 张晋瑜    时间: 2013-2-22 20:09
标题: 你怎么看?看别人的贴,看出自己毛病了
本帖最后由 zhangjinyu1991 于 2013-2-22 20:11 编辑

这个另外一个兄弟的贴:
标题:HashSet集合的问题
地址:http://bbs.itheima.com/thread-38556-1-1.html
最后,对于这个小程序,我遇到了另外一个问题,想向大家请教:
对这个小程序做个小修改,就是Point中equals()、hashCode()都不重写

import java.util.HashSet;
import java.util.Set;
public class Test {
    public static void main(String[] args) throws Exception{
          Set set = new HashSet();
          Point p1 = new Point("lisi","nanjing");
          Point p2 = new Point("wangwu","shanghai");
          Point p3 = new Point("zhaoliu","beijing");
          set.add(p1);
          set.add(p2);
          set.add(p3);
         System.out.println(set.size());
         p1.name = "zhangsan";
         set.remove(p1);
         System.out.println(set.size());
   }
}
class Point{
      public String name;
      public String address;
      public Point(String name,String address){
            this.name = name;
            this.address = address;
      }
}
我发现结果是正确的,大家有什么看法说说吧,当能重写这两个方法是有必要的,大家说说看应该怎么重写?
作者: 张晋瑜    时间: 2013-2-22 20:13
就是大家发表一下自己的经验,什么时候要重写,重写这两个方法大家有什么心得(技巧)
作者: 黄鸿达    时间: 2013-2-22 23:09
本帖最后由 黄鸿达 于 2013-2-22 23:21 编辑

set方法底层已经是通过hashcode来检测对象的哈希值是否相同
也就是说通常只要new 的对象放在set里面都会认为不同,所以可以存进去

但是有时候,我们自己new 对象,比如new 2个学生对象,2个学生都叫张三,我们认为他们是同一个人,但是计算机却认为是2个不同的人,因为是2个对象,2个对象指向2个不同地址,计算出来的哈希值也不同。
这个时候,我们为了让计算机知道这个2个对象是同个人,我们就可以从学生对象所属类,改写起hashcode方法还有equals方法,来让这2个对象返回相同的哈希值,这样计算机能知道这2个人是同1个人,只存1个进去。

具体要不要要不要重写这2个方法,具体是由自己的需求决定。


然后我又看了看你提供的链接,为什么你的可以删除,链接的那个程序没删除到呢。因为remove这个方法通过所给参数的哈希值来对表里的数据的哈希值进行比对,一样就删除。你的没有改写哈希方法,由于p1地址值没变,所以哈希值也没变,所以能顺利删除,就算你吧p1的name改了名字,也没改变地址,so.
而链接的那个程序,由于改写了hashcode方法,是通过name和address的哈希值来决定哈希值。由于p1改变了name所以p1的哈希值也改变,remove找不到与之相符的哈希值,所以没删除成功~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2