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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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;
      }
}
我发现结果是正确的,大家有什么看法说说吧,当能重写这两个方法是有必要的,大家说说看应该怎么重写?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
就是大家发表一下自己的经验,什么时候要重写,重写这两个方法大家有什么心得(技巧)
回复 使用道具 举报
本帖最后由 黄鸿达 于 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找不到与之相符的哈希值,所以没删除成功~

评分

参与人数 1黑马币 +9 收起 理由
李培根 + 9 赞一个!

查看全部评分

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