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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘学宾 中级黑马   /  2012-11-19 14:42  /  2078 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1,Object类中的hashCode方法返回的哈希值,是调用对象的引用(地址),那么这个地址是内存的物理地址吗?
2,这个哈希值又是怎么计算出来的啊?
3,我们平时说的引用变量存储的是他所指向的对象的地址,那这个地址是上面所说的哈希值吗?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
hashCode是根据对象的内存地址换算出的一个值

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
Object类里,hashcode方法 是 public native int hashCode();是一个本地方法,目的是算出对象的地址值。平时所说的指向的地址问题,应该是JVM里面的虚拟地址值,不是实际的物理地址

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
1.先回答你的第一个问题吧。Object类中的hashCode是返回对象在内存中地址转换成的一个int值(可以就当做地址看),也就是说全局唯一的。
2.哈希值应该是调用的java底层写好的object对象的哈希算法给算出来的吧。这是数据结构的知识,推荐你看一下数据结构的书,这个我也具体没看过,只是猜测。
3.应该不是上面的值,存的应该是该对象在内存中的物理地址。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
hashcode 作用 实例的唯一标识
在同一运行环境下 hashcode 的值是唯一的 就是两个不同实例其hashcode在同一运行环境绝对不一样 主要用来区分 两个实例在物理上是不是同一个对象
提高从集合中查找元素的效率。这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码。可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对行啊应该存储在哪个区域。

       HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的哈希吗,然后根据哈希吗找到相应的存储区域,最后取出该存储区域内的每个元素对该对象进行equals方法比较,这样不用遍历集合中的所有元素就可以得到结论。可见,HashSet集合具有很好的对象检索性能,但是,HashSet集合存储对象的效率相对要低些,因为向HashSet集合添加一个对象时,要先计算出对象的哈希码和根据这一个哈希码确定对象在集合中的存放位置。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
也算是物理地址中,
首先hash是一种算法,被广泛的用在加密技术上
此处的哈希值应该是由内存通过一系列的算法然得到的一个int型的值
回复 使用道具 举报
hashCode()方法返回哈希值。 你可以暂时这么理解hash值就是内存地址值。

至于hash算法是一位牛人发明出来的一种算法。可以实现高效的查询。
这种算法把每个放入hash集合的对象,计算出hash值,根据hash值存储在不同

区域(专业术语叫桶)。然后你查询的时候,根据你查询对象的hash值,就可以找到对应的区域。

然后就在那个区域里面找。


这样就可以不用遍历整个集合而获得想要的结果。这就是哈希算法的核心思想。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
陈军 发表于 2012-11-20 12:00
hashCode()方法返回哈希值。 你可以暂时这么理解hash值就是内存地址值。

至于hash算法是一位牛人发明出来 ...

哈希表实现的区域划分原理是通过哈希值取模形成的几个链表维护的,java中是这样的
回复 使用道具 举报
楼上说的很明白,学习了
我简单理解哈希表原理就是通过一系列加密运算,把不同对象在内存中的地址存储到哈希表中,来实现对象的唯一化存储,进而进行查询等操作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马