我正在解决Quora problem,对于我的特定解决方案,我需要一个用于缓存值的哈希表(long-key,int-values)。我希望Java HashMap可以改进,因为我知道我的数据类型的键和值,它们是原始的,也是我的问题空间。我决定天真地使用“array-of-linkedlist”结构实现一个简单的哈希表(甚至我的linkedList是我自己实现的Node类)。但我注意到我自己的天真实现比通用Java HashMap慢了4倍。我还尝试使用Trove's LongToIntMap库来查看它们的作用。有没有人有任何好的建议在Java中构建一个明显优于Java HashMap的自定义Long to Int哈希表?
答案 0 :(得分:1)
答案 1 :(得分:1)
我还尝试使用Trove的LongToIntMap库来查看它们的作用。
您是否尝试查看代码以了解他们是如何做到的?
在不查看代码的情况下,无法确定您在实施中做错了什么。但是,一种可能的改进可能是将LinkedList<Integer>
替换为使用int[]
来表示列表的自定义“整数列表”类型。根据您的哈希表API,您应该能够避免将值表示为对象(特别是Integer
s)的成本。 (作为推论,通过不实现具有键和/或值类型的泛型类型的API,您将获得更好的性能和空间利用率。)
对于它的价值,一个可能导致性能不佳的错误就是忽略了实现散列表调整大小。如果不调整大小,表格上get
和put
操作的复杂性将为O(N)
而不是O(1)
...因为哈希链长度将与数字成比例增长哈希表条目。
最后,您需要清楚自己是否在优化性能或空间利用率。最佳解决方案将有所不同......