Java中哈希表的自定义实现?

Java中哈希表的自定义实现?,java,generics,hashmap,hashtable,trove4j,Java,Generics,Hashmap,Hashtable,Trove4j,我正在解决这个问题,对于我的特定解决方案,我需要一个哈希表(长键、int值)来缓存值。我希望Java HashMap能够得到改进,因为我知道键和值的数据类型,它们是原语,也是我的问题空间。我决定天真地使用“linkedlist数组”结构实现一个简单的哈希表(甚至我的linkedlist也是我自己实现的节点类)。但我注意到,我自己的幼稚实现比普通Java HashMap慢4倍左右。我还试着用图书馆来看看他们在做什么。有没有人对在Java中构建一个性能明显优于Java HashMap的自定义Long

我正在解决这个问题,对于我的特定解决方案,我需要一个哈希表(长键、int值)来缓存值。我希望Java HashMap能够得到改进,因为我知道键和值的数据类型,它们是原语,也是我的问题空间。我决定天真地使用“linkedlist数组”结构实现一个简单的哈希表(甚至我的linkedlist也是我自己实现的节点类)。但我注意到,我自己的幼稚实现比普通Java HashMap慢4倍左右。我还试着用图书馆来看看他们在做什么。有没有人对在Java中构建一个性能明显优于Java HashMap的自定义Long-to-Int哈希表有什么好的建议?

看看Javolution的。源代码可用

我还尝试使用Trove的LongToIntMap库来查看它们的功能

你有没有试着看看代码,看看他们是怎么做的


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

值得一提的是,一个可能导致性能低下的错误是忽略了实现哈希表大小调整。如果不调整大小,表上的
get
put
操作的复杂性将是
O(N)
而不是
O(1)
。。。因为哈希链长度将与哈希表条目的数量成比例增长


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

您是否分析了您的代码并查看了它在哪里花费了所有的时间?在散列函数中?附加链接列表?添加?质疑?记住Knuth的咒语:“过早优化是万恶之源”。除非您有——或者有理由怀疑——标准库实现存在问题,否则您可能不应该担心它。至少不是“过早”;-)“…将是O(N)而不是O(N)…这仍然是渐进地快于,比方说,O(N),我猜…:-)@德克-修正。(你知道我的意思…)