又来麻烦前辈们了QAQ :关于覆写hashCode()方法

Fulora 2012-09-15 02:20:04

下面是用HashMap来装“人名和身份证号”的信息


-------------Code.java-----------
package com.Code_Person;

public class Code
{
public final int id; //身份证号已确认,不能修改
public Code(int id)
{ this.id=id; }
//覆写equals()
public boolean equals(Object anObject)
{
if(anObject instanceof Code)
{
return this.id==((Code)anObject).id;
}
return false;
}
public String toString()
{
return id+"\n";
}
//覆写hashCode()
public int hashCode()
{
return this.id;
}
}
--------------Person.java--------------
package com.Code_Person;

public class Person
{
public String name;
public Code id;
public Person(String name,Code id)
{
this.name=name;
this.id=id;
}
//覆写equals()
public boolean equals(Object anObject)
{
if(anObject instanceof Person)
{
return this.id.equals(((Person) anObject).id);
}
return false;
}
public String toString()
{
return "姓名:"+name+" "+id;
}
//覆写hashCode()
public int hashCode()
{
return this.id.id;
}
}
----------------HashCode.java-----------------
package com.Code_Person;
import java.util.*;

public class HashCode {
public static void main(String[] args)
{
/*第一部分用身份证号作key,用人名作value,显示信息
用p9去顶替掉p4,然后通过p9的身份证号找到p9的信息
按照要求覆写了Code.hashCode()来保证哈希值一样
这一部分成功了*/

HashMap map=new HashMap();
Person p1=new Person("哈哈1号",new Code(111));
Person p2=new Person("哈哈2号",new Code(222));
Person p3=new Person("哈哈3号",new Code(333));
Person p4=new Person("哈哈4号",new Code(444));
map.put(p1.id,p1);
map.put(p2.id,p2);
map.put(p3.id,p3);
map.put(p4.id,p4);
System.out.println("map:"+"\n"+map);//显示
Person p9=new Person("豪豪4号",new Code(444));
map.put(p9.id,p9);
System.out.println("map:"+"\n"+map);//更新后再显示
System.out.println("身份证为444的人的信息:"+"\n"+map.get(new Code(444)));
//
System.out.println();
System.out.println();
//

/*第二部分用人名作key,用身份证号作value,显示信息
用p10去顶替掉p8,然后想通过p10的人名找到p10的信息,
但问题(1)p10没有替换掉p8,显示的仍然是"哈哈8号",
而问题(2)在查找"豪豪8号"的时候,却仍然能找出信息,
为了hashCode一致,在Person类里面也做了覆写,不知道错在什么地方,
是不是哪里理解出错了,求前辈们指点
*/

HashMap map2=new HashMap();
Person p5=new Person("哈哈5号",new Code(555));
Person p6=new Person("哈哈6号",new Code(666));
Person p7=new Person("哈哈7号",new Code(777));
Person p8=new Person("哈哈8号",new Code(888));
map2.put(p5,p5.id);
map2.put(p6,p6.id);
map2.put(p7,p7.id);
map2.put(p8,p8.id);
System.out.println("map2:"+"\n"+map2);//显示
Person p10=new Person("豪豪8号",new Code(888));
map2.put(p10, p10.id);
System.out.println("map2:"+"\n"+map2);//更新后显示,问题(1)
System.out.println("查找名叫豪豪8号的人信息:"+"\n"+map2.get(new Person("豪豪8号",new Code(888))));//问题(2)
}
}





看网上总是很强调要覆写hashCode()才能来比较两个对象,但实际自己动手写却很晕不知道要抓住什么要点0.0

运行结果

map:
{222
=姓名:哈哈2号 222
, 444
=姓名:哈哈4号 444
, 111
=姓名:哈哈1号 111
, 333
=姓名:哈哈3号 333
}
map:
{222
=姓名:哈哈2号 222
, 444
=姓名:豪豪4号 444
, 111
=姓名:哈哈1号 111
, 333
=姓名:哈哈3号 333
}
身份证为444的人的信息:
姓名:豪豪4号 444



map:
{姓名:哈哈6号 666
=666
, 姓名:哈哈8号 888
=888
, 姓名:哈哈5号 555
=555
, 姓名:哈哈7号 777
=777
}
map:
{姓名:哈哈6号 666
=666
, 姓名:哈哈8号 888
=888
, 姓名:哈哈5号 555
=555
, 姓名:哈哈7号 777
=777
}
查找名叫豪豪8号的人信息:
888

...全文
92 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddplayer12 2012-09-15
  • 打赏
  • 举报
回复
对象比较一般都覆写equals和hashcode方法

1、当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前对象,挡在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。
2、重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。
3、Ojbect类的hashCode方法返回的是Object对象的内存地址。可以通过Integer.toHexString(new Object().hashCode);来得到。
结贴是美德 2012-09-15
  • 打赏
  • 举报
回复
key不会被覆盖,value会被覆盖。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧