1

我需要实现一种非常有效的方法来检查某个键(长值)是否存在于 java 中的一小部分项目(少于 100 个,通常约为 10 个)中。

此检查必须尽可能高效,因为它将每秒进行多次(超过 1000 次,我正在处理多播提要并且我想丢弃不需要处理的消息)。

需要检查的项目在应用程序生命周期中几乎没有变化,而且在性能方面可能会很昂贵。

谢谢

感谢所有及时回复。我担心的是我的长键可能非常集中在长的一个小范围内,我很担心。如果你们认为这不会是一个问题,我会试一试。

4

2 回答 2

3

使用 a -返回HashSet<Long>需要几纳秒(字面意思) 。contains()

代码如下:

private static Set<Long> keys = new HashSet<Long>();
// populate keys

if (keys.contains(requestKey)) { // this call is super fast!
    // ignore request
}

编辑:

不要担心你的渴望是“密切”在一起的。hashCode()of足够“Long分散”,以至于对于所有实际目的都没有模式 - 也就是说,“接近”的 Long 没有“接近”的哈希码。

于 2012-05-30T14:32:04.033 回答
0

如果效率优先于多功能性,您可以考虑使用 Trove's TLongHashSet

长原语的开放寻址集实现。

这会给你 O(1) 并完全避免自动装箱。但这对于这么小的收藏可能是一个极端的选择。

于 2012-05-30T14:28:34.103 回答