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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© @白纸嘿字@ 中级黑马   /  2015-9-20 23:43  /  6823 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
现正看到黑马毕向东HashSet,看着看着,有点懵,想问一问哈希值就是“地址”?如果不是,“地址”是什么?
如果我就是不想用HashSet存(就想用ArrayList存),算哈希值,还有什么用?

最佳答案

查看完整内容

哈希值和地址值是不一样的,哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,是系统分配的,是不存在相同的,而哈希值是可以通过强制手段设置为相同的,也就是说哈希值是一种逻辑上的确保唯一性,而地址值就是物理上确保唯一性。

21 个回复

倒序浏览
哈希值和地址值是不一样的,哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,是系统分配的,是不存在相同的,而哈希值是可以通过强制手段设置为相同的,也就是说哈希值是一种逻辑上的确保唯一性,而地址值就是物理上确保唯一性。

点评

说得比较准确。  发表于 2015-9-21 12:41
回复 使用道具 举报
http://bbs.csdn.net/topics/390681385#post-396454812
回复 使用道具 举报
本帖最后由 Coolman 于 2015-9-21 00:25 编辑

http://www.blogjava.net/flysky19/articles/102289.html

回复 使用道具 举报
我理解的哈希值就是地址。。。。。。。
回复 使用道具 举报
哈希值只是计算后放在一段连续内存中某个位置,不代表是一个内存地址
回复 使用道具 举报
哈希值是通过算法来的   我们看到的是由计算机分配的一个哈希值作为一个地址值
回复 使用道具 举报
哈希值是通过算法来的   我们看到的是由计算机分配的一个哈希值作为一个地址值   来反映其存放的位置,方便引用
回复 使用道具 举报
Hash值的作用是:判断两个对象是否相同。
Hash值并不是,地址。而是用特定的算法,使用特定的算法计算所得。

附:Java哈希算法代码实现

ConsistentHash.zip

1.5 KB, 下载次数: 391

回复 使用道具 举报
java中hash值只是一个标识而已 并非内存地址 你看看String 和Int的的源代码就知道了
回复 使用道具 举报
哈希值是通过哈希算法对内存地址值进行计算得到的一个整数值,可以理解为一个数字标识,不同对象的哈希值是有可能相同的。
还有如你说的,如果就是用ArrayList 那算哈希值确实没有用!
回复 使用道具 举报
假的地址,通过一个算法算出来的
回复 使用道具 举报
这就牵扯到哈希算法,
回复 使用道具 举报
HashMap通过hashCode方法和equals方法来判断相同。hashCode计算出key的hash值,然后以该值为输入计算它在map中的存放位置,即相对于起始位置的偏移量。但是这个位置不是物理内存地址。
回复 使用道具 举报
当 hash 相等时,会使用 equals 方法比较两个元素是否相等,具体 equals 比的是什么,要看具体的实现,在Object 类中提供的基本实现是比较 reference 的值,也就是所谓的“地址值”。
回复 使用道具 举报
首先要明确HashSet集合的底层是使用时是什么?底层是使用哈希表,所谓的哈希表底层其实使用的还是数组,只是这个数组中存在一种算法:哈希算法。所以才称作哈希表


HashSet集合底层哈希表存储元素的过程:
1、     在向HashSet集合中存储元素时,会先拿要存储的元素和哈希算法结合,计算出哈希值(元素的存储位置)。
2、     判断计算出的存储位置上是否已经有元素存在了
有元素存在:拿要存储的元素和已经存在的元素进行equals比较

            equasl结果:相同 ,表示重复元素。不做存储操作
            equals结果:不相同, 继续计算新的存储位置(常用作法:拉链法)
拉链法:会使用当前存储位置和哈希算法继续计算新的存储位置,再判断新的存储位置上是否有元素存在(和之前方案类同)
没有元素存在:直接把元素存储到该位置上

回复 使用道具 举报
 Hash,一般翻译做“散列”,也有直接音译为”哈希“的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。   HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
回复 使用道具 举报
我还没有认真看完回帖,没有选最佳答案,怎么就自己选出来了!
难道我的账号被盗了?
回复 使用道具 举报
doomsday 发表于 2015-9-21 20:01
java中hash值只是一个标识而已 并非内存地址 你看看String 和Int的的源代码就知道了 ...

关键的关键的,是你能不能教一教我源代码怎么看?
回复 使用道具 举报
演员 发表于 2015-9-26 23:56
 Hash,一般翻译做“散列”,也有直接音译为”哈希“的,就是把任意长度的输入(又叫做预映射, pre-image ...

能不能用深入浅出的,老百姓都能看懂的文字,重新解释一遍!我看了,更懵了!!!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马