hashCode和equals方法有什么区别,使用时要注意什么

hashCode是什么:

1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。

3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

equals方法:

1:equals方法是默认的判断2个对象是否相等的方法,在Object类里有实现,判断的是2个对象的内存地址,所以想要比较两个对象的内容,就要重写equals方法。
User u1 = new User(“张三”);
User u2 = new User(“李四”);
User u3 = new User(“张三”);
按照项目需求,用户只要名字相同,就表示同一个用户,所以我们认为,u1和u3是同一个人,同一个对象。但是因为u1,u2,u3三者的内存地址都各不相同,所以hibernate会认为这是3个不同的对象。这与我们假设的出了矛盾。 因此,我们将覆盖Object类中的equals方法。

例子:
string1=“aaa”;
string2=“aaa”;
String string3=new String(“aaa”);
String string4=new String(“aaa”);

string1string2 // true; .
string1.equals(string2);//true;
string3
==string4;//false 因为用new创建了2个对象,所以是两个不同的内存地址
string3.equals(string4);//true 而String类的是不可改变的,所以会指向同一个内存地址,所以返回为true

hashCode()与equals()的区别:

1.重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。
2.hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠。

所以得出来如下结论:

  1. equals()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

  2. hashCode()相等的两个对象他们的equals()不一定相等,也就是hashCode()不是绝对可靠的。

所以,如果有大量的数据需要判断的话,可以先用hashCode() 去判断(因为效率高),若不相等,则两对象必然不指向同一个对象,就不必再用equals() 去对比了,若hashCode相等,再用equals方法去进一步比较,若equals()也相同,则代表者两个对象真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性!。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值