黑马程序员技术交流社区

标题: 哈希值的问题 [打印本页]

作者: 回天之力    时间: 2013-11-4 14:03
标题: 哈希值的问题
哈希值是不是就是对象的地址值,如果是地址值的话,那么为什么不是同一个对象呢?


作者: Mr.Z.Lee    时间: 2013-11-4 14:13
HASH 是散列表的基础计算方法,Java 内置了 hash 的支持,java.lang.Object 默认是通过对象在内存的地址计算出来的,所以每个对方都是唯一的 hash,但是当我们创建我们自己的对象类时,我们根据需要和业务逻辑来决定是否提供自己的 hashcode 和 equals 方法。  多个对象的 hash 可能重复,这是正常的,重复的对象在 hash table 中是分配在同一个槽 (一个可以通过计算直接跳过那个位置的数组)中,会再通过 equals 对比 (在这个槽中的 hash code 都相同的一个链表中逐一 equals 比较 key) 找到那个对象。  所以逻辑上是否相同是通过 equals 来计算的,而且 equals 相同的两个对象,它们的 hash 也应该相同,如果你不能保证这点,那就说明你的 hashcode 和 equals 方法不是使用相同的算法。  一个对象是否存在不是通过 hash code 来判断的,而是 equals。 a == b 的话,a.equals (b) 肯定成立,但反过来就不一定。因为 a == b 比较的是对象的地址,只有同一个对象才能成立,equals 比较的是逻辑角度上的相等性。  看 String 或其它一个 JRE 自带的类的 hashcode 和 equals 方法是怎么做到的。
作者: ~﹏~    时间: 2013-11-4 14:16
hashCode是根据一定的算法产生的值,两个不相同的对象可能会产生不同的值哦
但是相同的对象一定会产生相同的hashCode,
纠正一下,不是对象的地制值
而是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
作者: ~﹏~    时间: 2013-11-4 14:16
对不起啊是:两个不相同的对象可能会产生相同的值哦
作者: 王裕秋    时间: 2013-11-4 14:17
hashCode(); 是一本地方法,也就是说当new一个对象的时候,都会有一个hash码,计算hash码用到相应的hash算法,我个人认为之所以hashcode()方法是一个本地方法,是应为java中的对象的hash码的得出是通过本地系统提供的hash算法(个人理解,有误请指正),还有java中 对象的hashcode并不是指对象的物理地址。你复写hashcode方法后,就是说对象的hashcode是按你写的方法来计算而已,在楼主的程序中你是new了两个对象,所以内存地址肯定是不一样的,但是在你定义的类中复写里hashcode方法,而且是返回一个确定的值,所以他们hash码肯定是一致的。
作者: ↘ふ紫铯幽夢    时间: 2013-11-4 15:09
java中的对象都有自己的hash值。是根据object类中的hashCode()方法计算出来的值。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2