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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李哲 中级黑马   /  2012-3-27 15:24  /  4578 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对象一定有哈希码值吗?即使复写hashCode方法,无法通过hashCode()得到哈希码值,对应依然还是具有哈希码值吗?

默认情况下,两个对象引用指向同一个对象,则o1.equals(o2)=true,此时为什么哈希码值就一定也是相等的?

当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。就是说,最好保证即使重写equals方法之后,也保持equals方法下相等,哈希值就会相等?因为默认状态下,就是equals方法下相等,哈希值就会相等。

7 个回复

倒序浏览
你看下api中Object类的解释就好了,那个说的全面


equals
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable



hashCode
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)


返回:
此对象的一个哈希码值。
另请参见:
equals(java.lang.Object), Hashtable

评分

参与人数 1技术分 +2 收起 理由
房宝彬 + 2

查看全部评分

回复 使用道具 举报
对象一定有哈希码值,当向集合中增加对象时,首先要增加对象的hashCode码,根据该值来得到一个区间用来存放当前对象,如果在该区间有对象存在的话,就与该区间上的对象进行equals方法比较,如不相等,才添加到集合中。这就是保证集合中无重复的元素的。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
hasdCose是将对象的内存地址转换成一个整数得来的,也就是对象在内存中的地址。
o1.equals(o2)=true;说明这个时候equals()方法比较的是内容,
但仍有两个对象,两个地址,所以hashCode值肯定不同

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
1Object既然都有hashcode方法的 那所有对象肯定有哈希值的 你说即使复写hashCode方法,无法通过hashCode()得到哈希码值是啥意思 不太懂哦,既然你自定义重新复写了这个方法 而这个方法是专门给对象生成哈希值的,就好比你是个男人 你怎么无法去做个男人逻辑一样...

2 两个对象引用同一个对象,那么我觉得首先是hash值应该相同 而equals是方法都是先判断哈希值 相同则equals也必相同,而不是因为equals相同所以推过来哈希值相同

3 hashcode方法是equals方法的前提 所以理所当然。还是这个,没有你这样反过来说的...
你还因为所以..逻辑反了。


评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
Object 的hashCode方法里面就一句返回语句  是 return 类名的 +@ +对象内存地址值   所以肯定和内存地址值有关系的
回复 使用道具 举报
对象一定有内存地址,所以一定有哈希值,因为哈希值是根据地址生成的整数;

如果两个对象用equals判断为true,必须让这两个对象的hashcode返回相同的整数值,因为必须把两个相等的对象放在同一个哈希桶中,而不能让不同的哈希桶中具有相等的对象,因为这样会导致无法查找。
回复 使用道具 举报
我觉得哈希表数据结构就是区分面向过程和面向对象的转变。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马