A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小白进阶之路 高级黑马   /  2018-1-7 21:50  /  1056 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问:两个对象值相同 (tmp1.equals(tmp2) == true) 但却可有不同的 HashCode 值,这句话有问题吗?

答:有问题,这句话是不对的。两个对象 tmp1 和 tmp2 满足 tmp1.equals(tmp2) == true 时它们的 HashCode 应当相同,因为 Java 对于 eqauls 方法和 hashCode 方法的规定是如果两个对象 equals 方法相等则它们的 hashCode 值一定要相同,如果两个对象的 hashCode 相同则它们的 equals 方法并不一定相同;实际中我们也可以不按照要求的原则去做,但是如果违背了上述原则就会发现在使用容器时相同的对象可以出现在 Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。


问:可以直接根据 hashCode() 方法产生的值判断两个对象是否相等吗?

答:不能。因为 hashCode()方法的由来是根据这个对象内存储的数据及对象的一些特征来做散列并返回一个有符号的 32 位哈希值,所以 hashCode() 方法返回的是一个散列值,而对于一个散列来说不同的内容也是可能会出现相同的散列值,所以即使两个对象的 hashCode() 返回值一样也并不能代表两个对象是相等的,要判断两个对象是否相等还是需要使用 equals() 方法。不过要注意:两个对象的 hashCode() 返回值相等不能判断这两个对象是相等的,但是两个对象的 hashCode() 返回值不相等则可以判断这两个对象一定不相等(原因如上题指导原则)
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马