Java - 最有效的匹配方法

时间:2014-09-17 08:30:02

标签: java performance list matching

假设一个人需要存储一个项目列表,但它可以存储在任何变量类型中;什么是最有效的类型,如果主要用于匹配?

为了澄清,需要包含一个项目列表,但它包含的表单无关紧要(枚举,列表,散列图,Arraylist等)。 该项目清单将定期进行匹配,但不进行编辑。假设您只需要一次写入列表,但每秒可以多次匹配,那么最有效的存储方法是什么?

注意:没有多线程

3 个答案:

答案 0 :(得分:1)

HashSet(和HashMap)提供O(1)复杂性。另请注意,您应该使用小 loadfactor 创建足够 HashSet,这意味着在哈希码检查后,结果桶中的元素也会很快找到(在一个桶中有一个顺序搜索)。最理想的是每个桶最多应包含1个元素。

您可以在HashMap的Javadoc中阅读有关容量和负载因子概念的更多信息。

更快的解决方案是,如果项目数不超过64,则为他们创建Enum并使用EnumSetEnumMap将元素存储在{ {1}}并使用简单且非常快速的位操作来测试元素是否在集合或映射中(包含操作只是一个简单的位掩码测试)。

如果您选择使用long而不是HashSet方法,请知道Enum使用元素的HashSethashCode()方法。您可以考虑覆盖它们以提供更快的实施,了解您希望存储的项目的内部 覆盖equals()的简单优化可以是例如在项目本身中缓存一次计算的哈希码,如果它没有改变(并且后续对hashCode()的调用应该只返回缓存的值)。

答案 1 :(得分:0)

根据您的描述,订单似乎并不重要。如果是这样,请使用Set。 Java的标准实现是HashSet。

答案 2 :(得分:0)

重复查找效率最高的几乎肯定是EnumSet

  

...枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的标志的高质量,类型安全的替代品。"即使批量操作(例如containsAll和retainAll)如果它们的参数也是枚举集也应该非常快速地运行。

     

...

     

实施说明:所有基本操作都在恒定时间内执行。他们很可能(虽然不能保证)比他们的HashSet对手快得多。如果它们的参数也是枚举集,即使批量操作也会在恒定时间内执行。