用Java自定义实现HashTable?

时间:2011-08-20 06:24:54

标签: java generics hashmap hashtable trove4j

我正在解决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哈希表?

2 个答案:

答案 0 :(得分:1)

看看Javolution的FastMap。源代码可用here

答案 1 :(得分:1)

  

我还尝试使用Trove的LongToIntMap库来查看它们的作用。

您是否尝试查看代码以了解他们是如何做到的?


在不查看代码的情况下,无法确定您在实施中做错了什么。但是,一种可能的改进可能是将LinkedList<Integer>替换为使用int[]来表示列表的自定义“整数列表”类型。根据您的哈希表API,您应该能够避免将值表示为对象(特别是Integer s)的成本。 (作为推论,通过不实现具有键和/或值类型的泛型类型的API,您将获得更好的性能和空间利用率。)

对于它的价值,一个可能导致性能不佳的错误就是忽略了实现散列表调整大小。如果不调整大小,表格上getput操作的复杂性将为O(N)而不是O(1) ...因为哈希链长度将与数字成比例增长哈希表条目。

最后,您需要清楚自己是否在优化性能或空间利用率。最佳解决方案将有所不同......