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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪龙 注册黑马   /  2014-4-10 20:56  /  1381 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

hashCode方法的作用?

8 个回复

倒序浏览
hashcode这个方法是用来鉴定2个对象是否相等的。
那你会说,不是还有equals这个方法吗?
不错,这2个方法都是用来判断2个对象是否相等的。但是他们是有区别的。
一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。
hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来讲,hashcode相当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。举个例子,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。
要从物理上判断2个对象是否相等,用==就可以了。

如果还有什么不懂,欢迎继续回复。。


评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
hashCode方法是与哈希表相关的。当集合中元素数据量庞大时,一个个比较对象是否相等是很低效的,使用hashCode可将元素进行分区管理,进行实例对象比较时,先比较实例对象的哈希值,然后再用equals方法比较对象是否相等,通过这种方法保证集合元素的唯一性,提高效率。
回复 使用道具 举报
咱简单点来理解  hashcode主要是hash算法之后得到的一个结果 而这个结果只要是用来标示存储的位置防止重复的
具体的理解 你可以去看看C语言里面的hash算法
回复 使用道具 举报
hashcode  方法,多数用来判断Map集合中元素的唯一性!

hashcode 是第一个检查标准,如果hashcode相同,在用equals来判断!

复写hashcode,一般为了提高程序的效率,返回一个更有意义的哈希值!

比如 在常写的 Person 类中,一般会有 name 和 age 这两个属性,

name 有可能重复,但是name 和 age 都重复就认为是重复的对象,

当把Person 对象存打 Map集合中时,一般复写 hashcode返回的是 name + age*13,

这样一般很少会去在调用 equals方法了,提高了程序的效率!

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
下面来一个数据结构中的哈希表存储的标准定义:

以线性表中的每个元素的某个数据项(最好是关键字)Key为自变量,使用一种事先选定的函数H(Key)计算出函数值,将该值解释为一块连续存储空间(如数组空间)的单元地址(如数组的下标),将数据元素存储到该单元中。

例如在a[10]中存入1,2,4,5,7值,哈希表会事先选定一个函数,假设该函数为H(Key)=key*3,即每个要存入的值先乘以3,然后将H(Key)的值再和数组大小求余,找到对应下标将Key存入。这个函数我们可以自己设置(不一定要乘以某个数,可以加入平方,立方,求余,怎么爽怎么来,目的是为了避免两个值对应同一个下标产生冲突),乘以300都没问题,因为和数组求余以后它的值和数组下标是对应的,这个函数值太大不会怎么怎么!

Java中HashCode()实现的就是上面怎么得到数组下标的过程,他返回的就是对应存储方式的单元地址(如数组下标)。

那么如果真的遇到冲突怎么办?(得到的数组下标一样。而且本来那块连续的存储空间就是有限的)

数据结构中提供了两种方法,开放地址法,链接法。Java中采用的就是链接法,用单链表存储,该数组下标中存入的是指向单链表的指针。如下图:

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
HashSet保证元素唯一性
是通过元素的两个方法时hashCode和equals来完成的
如果元素的hashCode值相同,才会判断equals是否是true
如果元素的hashCode值不同,不会调用equals
对于判断元素是否存在,以及删除等操作,依赖的方法时元素的hashCode
和equals方法
回复 使用道具 举报
Monkey·D·Chas 发表于 2014-4-10 21:46
下面来一个数据结构中的哈希表存储的标准定义:

以线性表中的每个元素的某个数据项(最好是关键字)Key为 ...

其实HashCode()很简单,我觉得如果我们知道哈希存储的原理,这问题就不是问题了!
来一个数据结构中的哈希表存储的标准定义:
以线性表中的每个元素的某个数据项(最好是关键字)Key为自变量,使用一种事先选定的函数H(Key)计算出函数值,将该值解释为一块连续存储空间(如数组空间)的单元地址(如数组的下标),将数据元素存储到该单元中。
例如在a[10]中存入1,2,4,5,7值,哈希表会事先选定一个函数,假设该函数为H(Key)=key*3,即每个要存入的值先乘以3,然后将H(Key)的值再和数组大小求余,找到对应下标将Key存入。这个函数我们可以自己设置(不一定要乘以某个数,可以加入平方,立方,求余,怎么爽怎么来,目的是为了避免两个值对应同一个下标产生冲突),乘以300都没问题,因为和数组求余以后它的值和数组下标是对应的,这个函数值太大不会怎么怎么!
Java中HashCode()实现的就是上面怎么得到数组下标的过程,他返回的就是对应存储方式的单元地址(如数组下标)。
那么如果真的遇到冲突怎么办?(得到的数组下标一样。而且本来那块连续的存储空间就是有限的)
数据结构中提供了两种方法,开放地址法,链接法。Java中采用的就是链接法,用单链表存储,该数组下标中存入的是指向单链表的指针。如下图:

哈希存储.jpg (130.46 KB, 下载次数: 17)

哈希存储.jpg
回复 使用道具 举报
以java.lang.Object来理解,JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做Object的比较或者取这个对象的时候,它会根据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。具体过程是这样:
1.new Object(),JVM根据这个对象的Hashcode值,放入到对应的Hash表对应的Key上,如果不同的对象确产生了相同的hash值,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同hashcode的对象放到这个单链表上去,串在一起。
2.比较两个对象的时候,首先根据他们的hashcode去hash表中找他的对象,当两个对象的hashcode相同,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一定在这个key上的链表上。那么此时就只能根据Object的equal方法来比较这个对象是否equal。当两个对象的hashcode不同的话,肯定他们不能equal.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马