我正在编写一个使用hashmap的java程序。我知道hashmap是如何工作的。如果我add(key,object)
,那么java会找到密钥的哈希码,并使用它来查找存储object
的存储桶。
现在,我为hashcode
拥有了自己的object
实现。我想把它作为关键 - 像add(object.hashcode(),object)
这样的东西。
是否有可能阻止java再次散列object.hashcode()
?因为我已经在哈希码上实现hashcode()
调用hashcode()
将是浪费时间。
答案 0 :(得分:5)
执行此操作的方法是实现hashCode()
以在计算哈希值后对其进行缓存。请注意,这意味着您的对象是不可变的,或者至少在将对象放入地图后,hashCode
和equals
的字段不会发生变化。
您不需要使用哈希码作为密钥。而且,这几乎肯定是错误的方法,因为它实际上不哈希表应该如何工作。哈希冲突是游戏的名称,因此哈希码仅用于寻址存储桶,但(名称全部说明)存储桶不包含一个,而是包含任意多个对象。必须由equals
检查这些内容,以找到您要查找的确切内容。
鉴于您最初的想法是使用哈希码作为关键字,看起来您不是真的在地图之后,而是在HashSet
之后。您只是将对象添加到集合中,稍后将要检查对象在其中的存在。那是一套。
答案 1 :(得分:1)
除非你有自己的实现,否则你不能这样做。原因是当您使用get方法时,散列用于拾取对象。