java的equals和hashcode的问题总结

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

一般equals()会比较每个对象的属性。当所有属性相同的时候,才会确定两个对象是相等的。

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

hashCode一般会通过 自定义的hash算法进行比较。自定义的hash算法有可能会造成两个不同的对象拥有相同的hashCode。

 

为什么要重写hashCode?

  因为hashCode效率高,在hashMap 的put方法时,需要 K 的hashCode值,来和集合中的 K 进行比较。如果hashCode 不相等,那么对象肯定是不相同的。可以put。如果两个对象的hashCode 的值相等,但是通过equals比较是不相等的,也会put到 map 中。如果equals比较两个对象都是相等的。那么就是真的相等的。所以要舍弃,不需要put 到map 中。

 

Object 的 hashCode()和equals()

都是比较地址,如果地址相同则相同。如果地址不同则不同。所以就算两个Object对象 内容是相同的,由于比较的是地址,所以两个 对象 的 hashCode 也不相同。所以返回的是false。

 

1、Object类的hashCode返回对象的内存地址经过处理后的结构,由于两个对象的内存地址都不一样,所以哈希码也不一样。 
2、String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符数组相同,返回的哈希码也相同。但是两个不同的字符数组也有可能返回相同的hashCode。 

for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}


3、Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如: 
Integer i1=new Integer(100); 
i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。 
由此可以看出Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。

 

转载于:https://www.cnblogs.com/stevehu1231/p/9150033.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值