使用 aHashMap
时,在速度方面,对象类型对元素检索有多大影响?假设我使用循环遍历大型哈希映射的可能键。我可以使用的最有效的密钥类型是什么?
到目前为止,由于简单起见,我使用 String 作为键对象类型。在编码时,这个问题突然出现在我的脑海中,引起了我的好奇心。我试图在网上搜索这个问题,但找不到我正在寻找的答案。谢谢!
使用 aHashMap
时,在速度方面,对象类型对元素检索有多大影响?假设我使用循环遍历大型哈希映射的可能键。我可以使用的最有效的密钥类型是什么?
到目前为止,由于简单起见,我使用 String 作为键对象类型。在编码时,这个问题突然出现在我的脑海中,引起了我的好奇心。我试图在网上搜索这个问题,但找不到我正在寻找的答案。谢谢!
关键hashCode()
,equals()
应该很快
hashCode()
应该分布良好以最小化哈希冲突
哈希映射会向您的密钥询问hashCode()
. 如果生成哈希码所花费的时间不合理,则此类对象的插入和检索时间会很长。举个java.net.URL
例子。它的 hashcode 方法执行 DNS 查找。这样的对象不会成为哈希映射的好键。
哪个是最好的钥匙没有统一的答案,因为没有最好的钥匙。用于哈希映射的最佳键是检索所需的键。只要确保钥匙的hashCode()
速度很快并int
适当地使用空间。
重要的是equals和hashCode方法的实现。请参阅以下内容:在 Java 中覆盖 equals 和 hashCode 时应考虑哪些问题?
由于这些函数用于散列操作,因此当您对集合进行操作时,它们的效率就会发挥作用。
作为旁注,请记住参考链接中的观点:
确保您放入集合中的关键对象的 hashCode() 在对象位于集合中时不会更改。确保这一点的防弹方法是使您的密钥不可变,这还有其他好处。
在您的情况下,重要的hashCode
是元素方法和方法的速度equals
。使用Integer
s 很好,因为它们不需要对哈希值进行任何特殊计算。字符串也可以,因为哈希值是在内部缓存的,尽管它们在equals
.
您是尝试通过get方法还是通过迭代从 HashMap 中检索值?至于get方法,上面的人都回答过了。
如果您通过entrySet方法迭代 HashMap ,则 HashMap 中键的类型无关紧要。此外,在每次迭代中都有一个entrySet的条目,查找值变得无用。另请注意,entrySet 通常比values方法和keySet方法更可取,因为它们在内部都使用 entrySet 迭代器并返回条目的键或值。