equals == hashcode

apchemaven 2009-04-20 10:38:01
昨天在用hashSet的时候 想起了几个问题,set是不可以重复,当往一个set里面添加对象的时候怎么判断的呢?
测试了一下 觉得是 先取得hashcode 如果相同就比较equals
如下(简写了):
	
Collection<User> coll = new HashSet<User>();

for (int i = 0; i < 2; i++) {
User u = new User(i, "name" + i);
coll.add(u);
}
User u = new User(0, "name0");
coll.add(u);
coll.add(u);

Iterator<User> it = coll.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}

这里在循环中添加的对象处理过程是比较hashcode,(这里都是相同的1),然后通过equals,我觉得是因为引用的不同 就是不同的对象,所谓的不重复
但是在下面 coll.add(u);的时候,仅仅取得hashcode就返回了,并没有添加进去,按照上面不是应该进行equals判断吗? 有人硕士因为两个u == 相等的缘故,这样更糊涂了,什么时候用equals 什么时候用==??

ps:
一个对象杂新建的时候就有一个hashcode ,这个hashcode是固定的还是可以人为指定的?,比方上面的hashCode方法返回一个4,是不是说该对象的hashcode已经被改成4了?
...全文
77 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fzdxwhl2007 2009-04-22
  • 打赏
  • 举报
回复
先检查hashCode,然后在检查equals 如果相同,则抛弃
qzl8023 2009-04-22
  • 打赏
  • 举报
回复
hashcode 如果相同就比较equals
apchemaven 2009-04-20
  • 打赏
  • 举报
回复
public User(int id,String name) {
this.name=name;
this.id=id;
}

@Override
public String toString() {
return "[id="+id+" name="+name+"]";
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof User)){
return false;
}
User u=(User)obj;
if(id==u.getId()){
return true;
}
return false;

}
@Override
public int hashCode() {
return 4;
}
apchemaven 2009-04-20
  • 打赏
  • 举报
回复
不好意思 上面没有写完整

User类重写了hashcode 和 equals方法

如下“

public User(int id,String name) {
this.name=name;
this.id=id;
}

@Override
public String toString() {
return "[id="+id+" name="+name+"]";
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof User)){
return false;
}
User u=(User)obj;
if(id==u.getId()){
return true;
}
return false;

}
@Override
public int hashCode() {
return 4;
}

GeekZFZ 2009-04-20
  • 打赏
  • 举报
回复
equals和hashCode方法满足的关系如下:
a.equals(b)==True ==> a.hashCode()==b.hashCode()
a.hashCode()==b.hashCode()对equals方法无要求
a.equals(b)==False对hashCode方法无要求
a.hashCode()!=b.hashCode() ==> a.equals(b)==False

62,614

社区成员

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

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