作者pttworld (批踢踢世界)
看板java
标题Re: [问题] HashCode 与 记忆体位置的关联
时间Mon May 25 00:34:58 2015
稍微看了一下原文和推文,有的是讲值,有的是讲方法,难以聚焦讨论。
以下讲方法是hashCode(),使用hashCode代表杂凑数值,是个值。
hashCode合理为hashCode()的回传值。
我用Y或N标注,仅供参考,其中我改一个中文字会让你的表达更清楚。
※ 引述《noapaov (单身汉)》之铭言:
: 标题: [问题] HashCode 与 记忆体位置的关联
: 时间: Sun May 24 18:01:23 2015
:
:
: 最近看了一下书籍, 不太清楚理解是否有错, 想请教一下各位
:
: Object 类别所提供的 hashCode() method, 主要是返回物件的记忆体位置
Y
:
: 经过运算後的整数, 所以与记忆体有密切关系
:
: 所以每个物件的HashCode()理论上应该都不一样, 但是有些子类别继承後会
Y
:
: 进行equals和HashCode的覆写,例如String、Array等, 所以就有可能造成 :
hashCode()
:
: 如果两个物件使用equals(Object) 测试结果为不相等,
:
: 则这两个物件呼叫 hashCode 时,可以获得不同的整数结果("可以相同,也可以不同")
^^^^
改成"但"
hashCode()
:
: 所以总结是如果继承Object类的子类别, 没有对equals hashCode进行改写,
hashCode()
:
: 那麽这些物件产生的HashCode应该都不一样, 但如果重写就有可能造成HashCode相等, 但不一定是参考相同的记忆体位置情况
Y
:
: 不知道原理是否是这样
N,不是原理,但就呈现来说上面你写的都是Y。
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.34.181.227
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1432461685.A.96A.html
: ※ 编辑: noapaov (114.34.181.227), 05/24/2015 18:02:00
: ※ 编辑: noapaov (114.34.181.227), 05/24/2015 18:02:09
: 推 mars90226: hashCode跟记忆体无关 05/24 20:48
: → mars90226: 他就是拿来计算hash需要的key而已 05/24 20:48
: → mars90226: hash需要这个key来判断两个Object是否一样 05/24 20:48
: 推 swpoker: 这里不是C++啊?!为什麽都记忆体位置东跟记亿体使用西呢 05/24 21:11
: → swpoker: ????? 05/24 21:11
: → MonyemLi: hashmap key 会受hashcode影响,但hash并不是记忆体位置 05/24 21:43
: → noapaov: 主要是看到document api写到 Object.hashCode()的定义 05/24 23:40
: → noapaov: This is typically implemented by converting the 05/24 23:41
: → noapaov: internal address of the object into an integer 05/24 23:41
: ※ 编辑: noapaov (114.34.181.227), 05/24/2015 23:42:00
从来当你覆写该方法可以因为写的不同内容达到你想要的目的。
就变成
若我希望(比如String)不同物件的equals()相同且希望hashCode也要相同,
才会特意去覆写hashCode()。
因为String的equals()仅比较字面意义。
简单记忆,希望equals()和hashCode()比较结果之一致,
就可能要覆写hashCode()。
PS.上述省略写继承系因为已经表明是覆写方法,省点字。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.248.170.63
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1432485301.A.8CC.html