一个关于hashCode 与equals的问题

athueryin 2008-11-07 10:32:32
import java.util.HashSet;
import java.util.Iterator;
class HashSetTest
{
HashSet<Student> hs =new HashSet<Student>();
public void put(Student o)
{
hs.add(o);
}
public void print()
{
Iterator<Student> it=hs.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
public static void main(String[] args)
{
HashSetTest hs1=new HashSetTest();
hs1.put(new Student(1,"fenhua1"));
hs1.put(new Student(4,"fenhua4"));
hs1.put(new Student(3,"wufeng"));
hs1.put(new Student(3,"wufeng"));
hs1.print(); /*我在Student类中虽然重写了hashCode(),equals(),但我在main()中并没有调用他们,为什么我输入两个new Student(3,"wufeng")对象到 hs1中,最终结果输出的只有一个3 :wufeng 补充:我已经明白有hashCode()和equals()方法能得到同一个内存地址,我想问的是,我没调用他们,怎么就实现了new Student(3,"wufeng"在内存中就得到了同一内存地址?


}
}
class Student
{
Integer num;
String name;



Student(Integer num, String name)
{
this.num=num;
this.name=name;
}
public String toString()
{
return num+":"+name;
}
public int hashCode()
{
return num*name.hashCode();
}
/* public boolean equals(Object obj)
{

if(obj instanceof Student){
Student s = (Student)obj;
return num == s.num && name.equals(s.name);
}*/
public boolean equals(Object obj)
{
Student s = (Student)obj;
return num == s.num && name.equals(s.name);
}
}
...全文
154 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_miao 2009-04-25
  • 打赏
  • 举报
回复
楼主 你的Student类中重写equals方法写错了吧 你定义的num属性 是Integer类型,是一个类,是引用类型,你去比较两个引用类型是否相等能用== 吗?
对于 我在Student类中虽然重写了hashCode(),equals(),但我在main()中并没有调用他们,为什么我输入两个new Student(3,"wufeng")对象到 hs1中,最终结果输出的只有一个3 你注意到Set接口是无序不可重复的了吗?
yinjiayy 2008-11-11
  • 打赏
  • 举报
回复
hasSet是根据 什么根据去掉重复内容的(建议lz去看一下源码具体实现)
yinjiayy 2008-11-11
  • 打赏
  • 举报
回复
首先 你得明白hasSet的作用 去重复(类容)
你在实体类中已经重写了hasCode 和equals方法
hasSet就是根据这两个方法判断是否重复
建议lz看看 equals 方法是怎样实现的
wenjunsu 2008-11-08
  • 打赏
  • 举报
回复

ZangXT 都来了。。。

我不是很懂。。。帮顶!

up,希望LZ解决问题!
ZangXT 2008-11-07
  • 打赏
  • 举报
回复
我在Student类中虽然重写了hashCode(),equals(),但我在main()中并没有调用他们,为什么我输入两个new Student(3,"wufeng")对象到 hs1中,最终结果输出的只有一个3 :wufeng 补充:我已经明白有hashCode()和equals()方法能得到同一个内存地址,我想问的是,我没调用他们,怎么就实现了new Student(3,"wufeng"在内存中就得到了同一内存地址?

说明: hashCode()和equals()只是在Object类中的定义与地址有关系。
你自己重写之后就没有关系了。

HashSet里面会用到equals()方法和hashCode()方法,可以直接看这个类的源代码

13,097

社区成员

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

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