我正在编写一个使用 hashmap 的 java 程序。我知道哈希图是如何工作的。如果是 I add(key,object)
,那么 java 会找到密钥的哈希码并使用它来找到一个存储桶来存储object
.
现在我有自己hashcode
的object
. 我想把它作为关键——比如add(object.hashcode(),object)
.
是否可以防止java再次散列object.hashcode()
?因为我已经在实现对哈希码的hashcode()
调用hashcode()
将是浪费时间。
问问题
662 次
2 回答
6
这样做的方法是实现hashCode()
在计算哈希值后对其进行缓存。请注意,这意味着您的对象是不可变的,或者至少是在将对象放入地图后贡献hashCode
并且equals
不会更改的字段。
您不需要使用哈希码作为密钥。此外,这几乎肯定是错误的做法,因为它实际上不是哈希表应该如何工作的。哈希冲突是游戏的名称,因此哈希码仅用于寻址存储桶,但是(名称说明一切)存储桶包含的对象不是一个,而是任意多个。必须检查这些equals
以找到您正在寻找的确切。
鉴于您最初使用哈希码作为键的想法,看起来您并不是真的在使用地图,而是在使用HashSet
. 您只是将对象添加到集合中,稍后将要检查对象在其中的存在。那是一套。
于 2012-11-15T16:50:47.237 回答
1
除非你有自己的实现,否则你不能这样做。原因是当您使用 get 方法时,散列用于选择您的对象。
于 2012-11-15T16:50:21.983 回答