使用HashMap
时,对于速度而言,对象类型对于元素检索有多重要?假设我使用循环来迭代大型哈希映射的可能键。我可以使用哪种最有效的密钥类型?
截至目前,由于简单起见,我使用String作为键对象类型。在编码时,这个问题突然出现在我的脑海中并激起了我的好奇心。我试图在网上搜索这个问题,但找不到我想要的答案。谢谢!
答案 0 :(得分:3)
键hashCode()
和equals()
应该很快
hashCode()
应该分布均匀,以最大限度地减少哈希冲突
答案 1 :(得分:3)
哈希映射会向您的密钥询问hashCode()
。如果生成哈希码所花费的时间不合理,则这些对象的插入和检索时间会很长。以java.net.URL
为例。它的hashcode方法执行DNS查找。这样的对象不会成为哈希映射的好键。
没有通用的答案,哪个是最好的钥匙,因为没有最好的钥匙。在哈希映射中使用的最佳密钥是检索所需的密钥。只需确保密钥的hashCode()
速度很快,并恰当地使用int
空格。
答案 2 :(得分:1)
重要的是 equals 和 hashCode 方法的实现。请参阅以下内容:What issues should be considered when overriding equals and hashCode in Java?
由于这些函数在哈希操作中使用,因此当您对集合进行操作时,它们的效率会发挥作用。
作为旁注,请记住参考链接中提出的观点:
确保放入的关键对象的hashCode() 当对象在集合中时,集合永远不会更改。该 防弹方式,以确保这是使你的密钥不可变,这 还有其他好处。
答案 3 :(得分:1)
在您的情况下,重要的是元素hashCode
方法和equals
方法的速度。使用Integer
s很好,因为它们不需要对哈希值进行任何特殊计算。字符串也可以,因为哈希值在内部缓存,尽管它们在equals
时执行速度较慢。
答案 4 :(得分:0)
您是尝试通过 get 方法从HashMap中检索值还是迭代它?至于 get 方法,以上所有人都回答了这个问题。
如果您通过 entrySet 方法迭代HashMap,则HashMap中键的类型并不重要。此外,在每次迭代中都有一个 entrySet 的条目,查找值变得无用。另请注意,entrySet通常优于 values 方法和 keySet 方法,因为它们在内部使用entrySet迭代器并返回条目的键或值。