一个关于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);
}
}
...全文
153 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()方法,可以直接看这个类的源代码
内容概要:本文详细介绍了Anaconda的下载、安装与配置方法(2025最新版)。Anaconda是一个开源的Python/R数据科学集成开发平台,预装了1500多个科学计算库,并提供conda包管理和环境管理功能。文章首先列出了系统要求,接着分别讲述了适用于不同操作系统的下载方式,包括官方下载和国内镜像下载。然后,具体讲解了Windows、macOS和Linux三种操作系统的安装步骤,以及环境变量的手动配置方法。此外,还提供了验证安装是否成功的命令和配置国内镜像源的方法,以提高下载速度。最后,列出了一些常用conda命令和常见问题的解决方案。 适合人群:从事数据科学、机器学习领域的研究人员和开发者,特别是需要频繁使用Python科学计算库的用户。 使用场景及目标:①帮助用户快速搭建Python开发环境,尤其是需要多个Python版本共存或隔离环境的情况下;②解决因网络原因导致的下载速度慢的问题;③提供详细的安装指南,确保安装过程顺利进行;④指导用户正确配置环境变量,避免常见的安装后无法使用的错误。 阅读建议:由于Anaconda涉及多平台安装和配置,建议读者根据自己的操作系统选择相应的章节重点阅读,并严格按照步骤操作。对于初次使用者,建议先从简单的安装入手,再逐步学习环境管理和包管理的相关命令。

13,097

社区成员

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

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