2012-11-15 93 views
0

我正在写一个使用哈希映射的java程序。我知道一个hashmap是如何工作的。如果我是add(key,object),那么java将找到密钥的哈希码并使用它来查找存储object的存储桶。
现在我有我自己的hashcode执行object。我想把这个作为关键 - 就像add(object.hashcode(),object)
是否有可能阻止java再次哈希object.hashcode()?因为我已经执行hashcode(),所以调用hashcode()上的hashcode会浪费时间。使用我自己的哈希码哈希映射java

+1

我认为有一个很好的理由,你为什么不只是想重写相关对象的'hashCode'方法? – Perception

+0

@Perception:但hashmap会考虑密钥的哈希码,对吧? – Ashwin

+1

嗯,是的,但假设在将对象添加到地图后没有更改对象的任何'关键'属性,只需调用'map.put(object,object)'。 – Perception

回答

5

执行此操作的方法是实施hashCode()以在计算散列值后对其进行高速缓存。请注意,这意味着您的对象是不可变的,或者至少在将对象放入地图后,对hashCodeequals作出贡献的字段不会更改。

您不需要使用散列码作为密钥。此外,这几乎肯定会是错误的做法,因为它实际上是而不是哈希表应该如何工作。哈希碰撞是游戏的名称,因此哈希码仅用于对一个存储桶进行寻址,但(名称全称)一个存储桶不包含一个,但包含任意多个对象。这些必须通过equals进行检查以找到您正在寻找的确切人。

鉴于你最初的想法是使用hashcode作为关键,它看起来像你不是真的在地图之后,但在HashSet之后。您只是将对象添加到集合中,稍后会想要检查对象的存在。这是一套。

+0

我不明白。 – Ashwin

+1

“我不明白”不是有用的评论。 –

+0

好的。如果我使用我自己的哈希代码实现,并且如果发生冲突,那么该存储桶中的对象将被放入链接列表中。我也可以为“对象”提供等式的实现。 – Ashwin

1

除非你有自己的实现,否则你不能这样做。原因是当你使用get方法时,哈希被用来选择你的对象。

+0

“原因是当你使用get方法时,哈希被用来选择你的对象” - 是的,我正在提供自己的哈希。 – Ashwin

+0

你正在做像map.put(object.hashCode(),...)。对吗?当这样做时,地图将获取作为密钥传递的对象的hashCode(这里的关键是你的hashCode)。 – muruga