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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 回天之力 中级黑马   /  2013-11-4 14:03  /  1108 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

哈希值是不是就是对象的地址值,如果是地址值的话,那么为什么不是同一个对象呢?

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
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 方法是怎么做到的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
hashCode是根据一定的算法产生的值,两个不相同的对象可能会产生不同的值哦
但是相同的对象一定会产生相同的hashCode,
纠正一下,不是对象的地制值
而是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
对不起啊是:两个不相同的对象可能会产生相同的值哦
回复 使用道具 举报
hashCode(); 是一本地方法,也就是说当new一个对象的时候,都会有一个hash码,计算hash码用到相应的hash算法,我个人认为之所以hashcode()方法是一个本地方法,是应为java中的对象的hash码的得出是通过本地系统提供的hash算法(个人理解,有误请指正),还有java中 对象的hashcode并不是指对象的物理地址。你复写hashcode方法后,就是说对象的hashcode是按你写的方法来计算而已,在楼主的程序中你是new了两个对象,所以内存地址肯定是不一样的,但是在你定义的类中复写里hashcode方法,而且是返回一个确定的值,所以他们hash码肯定是一致的。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
java中的对象都有自己的hash值。是根据object类中的hashCode()方法计算出来的值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马