Trove集合如何比标准Java集合更高效?

时间:2013-11-16 17:05:13

标签: java collections

在最近的一次采访中,我被问及HashMap如何在Java中工作,我能够很好地解释它,并解释在最坏的情况下,由于链接,HashMap可能会退化为列表。我被要求找出改善这种表现的方法,但在采访中我无法做到这一点。面试官让我抬头看“Trove”。

我相信他指的是this page。我已经阅读了该页面上提供的描述,但仍无法弄清楚它是如何克服java.util.HashMap的限制的。

即使是暗示也会受到赞赏。谢谢!

3 个答案:

答案 0 :(得分:6)

关键词是开放式寻址。所有条目都在一个大数组中,而不是散列到一个桶数组。添加元素时,如果元素的空间已经在使用中,则只需向下移动数组即可找到可用空间。

只要数组保持足够大于条目数并且散列函数分布均匀,就可以保持平均查找时间很短。通过使用一个阵列,您可以获得更好的性能 - 它更加缓存友好。

然而,如果(比方说)每个键散列到相同的值,它仍然具有最坏情况的线性行为,因此它不会避免该问题。

答案 1 :(得分:5)

在Trove页面中,我认为有两个主要差异可以提高性能。

第一种是使用开放式寻址(http://en.wikipedia.org/wiki/Hash_table#Open_addressing)。这不会避免碰撞问题,但它确实意味着不需要为地图中的每个项目创建“Entry”对象。

第二个重要的区别是能够提供自己的哈希函数,它与密钥类提供的函数不同。因此,如果有意义的话,你可以提供更快的哈希函数。

答案 2 :(得分:4)

Trove的一个优点是它可以避免对象创建,特别是对于基元。 对于嵌入式Java设备中的大哈希表,由于内存消耗较少,这可能是有利的。

我看到的另一个优点是使用自定义哈希码/函数而无需覆盖hashcode()。对于特定的数据集,以及编写散列函数的专家,这可能是一个优势。