HashSet的对象必须实现hashCode()和equals()

java中hashset跟对象重载的equals和hashcode方法到底有什么关系?

以下面里面分析:
import java.util.HashSet;

public class EmployeeTest
{
static int count = 0;
static public class Demo
{
public Demo(String s){
mStr = s;
}
public boolean equals(Object object){
boolean b = mStr.equals(((Demo)object).mStr);     // 尝试修改代码返回true或false
return b;
}
public int hashCode(){
return ++count;  // 尝试修改代码返回定值或变值
}
public String mStr;
}
       public static void main(String[] args)
       {
   HashSet<Demo> set = new HashSet<Demo>();
   boolean b = false;
   b = set.add(new Demo("aa"));  // hashset的add方法文档中指出当 !obj1.equals(obj2)   时才会进行插入
   b = set.add(new Demo("bb"));
   b = set.add(new Demo("bb"));
   System.out.print(set.size());
       }
}
如果hashcode函数返回一个定值,即所有对象的hashcode相同时,当尝试插入第二个数据(或以上)时,会发现程序还会去调用equals方法,并且该函数返回false时才回插入hashset;当hashcode返回不同时会忽略equals函数并直接插入hashset。

总结,hashset先调用对象的hashcode函数来进行散列,当散列到不同位置时,则认为对象不相同且进行插入操作(不用判断equals函数);当散列到同一个位置才会调用对象的equals函数来进行比较,只当equals返回false则认为两个对象不相等才会进行插入操作,否则认为两个对象相同而不进行插入操作。

自定义对象,重载equals和hashcode时,应该保证两个对象的hashcode的比较结果,和,两个对象的equals函数比较结果,一样。
本例子只是为了说明问题。

刚刚开始使用java语言,以上都是通过调试数据推断出来的,更好的办法应该是读源代码。如果有错,欢迎指出。
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值