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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 吴在兴 中级黑马   /  2013-1-29 23:39  /  1590 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对?

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

10 个回复

倒序浏览
对。但是在Java中建议,当x.equals(y)等于true时,x.hashCode()与y.hashCode()也相等。
回复 使用道具 举报
不一定吧,要看你equals方法有没有重写,方法内有没有对hashcode的值进行相等的判断。
当然,严谨的做法就是重写equals的话就要重写hashcode方法,保证equals成立时对象的hashcode也相等。
回复 使用道具 举报
这就话是对的 如果你理解不了可以偷点懒 ,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是这样),虽然这样解释是不正确的 但是,可以帮助你理解,如果你想弄明白的的理解哈希算法中的哈希表 在理解一下集合类就差不多了
得技术分的孩子伤不起啊  

评分

参与人数 1黑马币 +3 收起 理由
吴在兴 + 3

查看全部评分

回复 使用道具 举报
对。
如果对象要保存在 HashSet 或 HashMap 中,它们的 equals 相等,那么,它们的 hashcode 值 就必须相等。
如果不是要保存在 HashSet 或 HashMap,则与 hashcode 没有什么关系了,这时候 hashcode 不等是可以的,例如 arrayList 存储的对象就不用实现 hashcode,当然,我们没有理由不实 现,通常都会去实现的。
回复 使用道具 举报
本帖最后由 杨杨 于 2013-2-1 15:44 编辑

没有一个人能回答的让 版主满意啊 我在尝试的回答一下
“当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对?
这就话是正确的 可以相等也可以不相等
x.equals(y) 当=true 举个例子
String x="a",y="b";
                System.out.println(x.equals(x));//true
                int m=x.hashCode();
                int n=y.hashCode();
                System.out.println(m==n);//false

测试n变也是 这结果 他们会不会相等呢 会 但是可能行比较小
String 类的String 对象的哈希码根据以下公式计算:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]



hashCode
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:
Object对象中的hashCode
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
也就是说 如果类你你不重新hashCode 他一般就不会相等 。但是存在相等的可能性
我查看了 Object对象的源码
public native int hashCode();
native 关键字的解释
JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
      使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚机

看到楼上的朋友说重新 hashCode方法 我想可能性比较小 ,String重新是为了优化 。。。。
如果版主认为解释的正确请加分如果认为不能加分我还会继续关注直到有人能够加分



回复 使用道具 举报
首先我们要先来了解一下java中equals和==的区别,
在java中,equals比较的是对象指向的堆内存中的值是否相同
==比较对象时,比较的是栈中存放的地址值是否相同,如果比较基本数据类型时比较的是基本数据类型的数值是否相同
根据楼主的问题:
当x.equals(y)为true时,说明x,y指向的是同一个堆内存空间,即指向的是堆内存中的同一个数据,所以这x,y的hashCoad是相同的
回复 使用道具 举报
“当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对?
” 这就话是正确的 可以相等也可以不相等
在没有覆写equals()的情况下equals比较的是内存地址所指向的值,hashCode()是比较内存地址,不同地址可以指向同一个值,所以可以相等也可以不相等
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马