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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

问:说说 hashCode() 的返回值和 == 的关系?

答:若 == 返回 true 则两边对象的 hashCode() 返回值必须相等,若 == 返回 false 则两边对象的 hashCode() 返回值有可能相等,也有可能不等;因为在 Java 中对象默认的 equals 方法实现就是 == 比较,而 Java 对于 eqauls 方法和 hashCode 方法的规定是如果两个对象 equals 方法相等则它们的 hashCode 值一定要相同,如果两个对象的 hashCode 相同则它们的 equals 方法并不一定相同,所以可得出上面结论。


问:Java 中 hashCode() 的作用是什么?

答:hashCode() 的作用是为了提高在散列结构存储中查找的效率,在线性表中没有作用;只有每个对象的 hash 码尽可能不同才能保证散列的存取性能,事实上 Object 类提供的默认实现确实保证每个对象的 hash 码不同(在对象的内存地址基础上经过特定算法返回一个 hash 码)。在 Java 有些集合类(HashSet)中要想保证元素不重复可以在每增加一个元素就通过对象的 equals 方法比较一次,那么当元素很多时后添加到集合中的元素比较的次数就非常多了,也就是说如果集合中现在已经有 3000 个元素则第 3001 个元素加入集合时就要调用 3000 次 equals 方法,这显然会大大降低效率,于是 Java 采用了哈希表的原理,这样当集合要添加新的元素时会先调用这个元素的 hashCode 方法就一下子能定位到它应该放置的物理位置上(实际可能并不是),如果这个位置上没有元素则它就可以直接存储在这个位置上而不用再进行任何比较了,如果这个位置上已经有元素了则就调用它的 equals 方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址,这样一来实际调用 equals 方法的次数就大大降低了,几乎只需要一两次,而 hashCode 的值对于每个对象实例来说是一个固定值。
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

1 个回复

倒序浏览
0000000000000000000000000000
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马