假设一个人需要存储一个项目列表,但它可以存储在任何变量类型中;什么是最有效的类型,如果主要用于匹配?
为了澄清,需要包含一个项目列表,但它包含的表单无关紧要(枚举,列表,散列图,Arraylist等)。 该项目清单将定期进行匹配,但不进行编辑。假设您只需要一次写入列表,但每秒可以多次匹配,那么最有效的存储方法是什么?
注意:没有多线程
答案 0 :(得分:1)
HashSet
(和HashMap
)提供O(1)
复杂性。另请注意,您应该使用小 loadfactor 创建足够 HashSet
,这意味着在哈希码检查后,结果桶中的元素也会很快找到(在一个桶中有一个顺序搜索)。最理想的是每个桶最多应包含1个元素。
您可以在HashMap
的Javadoc中阅读有关容量和负载因子概念的更多信息。
更快的解决方案是,如果项目数不超过64,则为他们创建Enum
并使用EnumSet
或EnumMap
将元素存储在{ {1}}并使用简单且非常快速的位操作来测试元素是否在集合或映射中(包含操作只是一个简单的位掩码测试)。
如果您选择使用long
而不是HashSet
方法,请知道Enum
使用元素的HashSet
和hashCode()
方法。您可以考虑覆盖它们以提供更快的实施,了解您希望存储的项目的内部
覆盖equals()
的简单优化可以是例如在项目本身中缓存一次计算的哈希码,如果它没有改变(并且后续对hashCode()
的调用应该只返回缓存的值)。
答案 1 :(得分:0)
根据您的描述,订单似乎并不重要。如果是这样,请使用Set。 Java的标准实现是HashSet。
答案 2 :(得分:0)
重复查找效率最高的几乎肯定是EnumSet
...枚举集在内部表示为位向量。这种表现非常紧凑和高效。这个类的空间和时间性能应该足够好,以允许它作为传统的基于int的标志的高质量,类型安全的替代品。"即使批量操作(例如containsAll和retainAll)如果它们的参数也是枚举集也应该非常快速地运行。
...
实施说明:所有基本操作都在恒定时间内执行。他们很可能(虽然不能保证)比他们的HashSet对手快得多。如果它们的参数也是枚举集,即使批量操作也会在恒定时间内执行。