java - 在 Java 中查看 ArrayList 是否包含对象的最有效方法

标签 java algorithm optimization search arraylist

我在 Java 中有一个对象的 ArrayList。这些对象有四个字段,其中两个我会用来认为对象等于另一个。鉴于这两个字段,我正在寻找最有效的方法来查看数组是否包含该对象。

关键是这些类是基于 XSD 对象生成的,所以我不能修改类本身来覆盖 .equals

有没有比循环遍历并手动比较每个对象的两个字段然后在找到时中断更好的方法?就是这么乱,找个更好的办法。

编辑: ArrayList 来自未编码为对象的 SOAP 响应。

最佳答案

这取决于您需要的效率。简单地遍历列表以查找满足特定条件的元素是 O(n),但如果您可以实现 Equals 方法,则 ArrayList.Contains 也是如此。如果您不是在循环或内部循环中执行此操作,那么这种方法可能就可以了。

如果您确实需要不惜一切代价实现非常高效的查找速度,您需要做两件事:

  1. 解决该类 生成:编写一个适配器类 可以包装生成的类和 实现equals()基于 在这两个领域(假设他们 是公开的)。别忘了还有 实现hashCode() (*)
  2. 用该适配器包装每个对象,然后 把它放在一个HashSet中。 HashSet.contains()有常数 访问时间,即 O(1) 而不是 O(n)。

当然,构建这个 HashSet 仍然需要 O(n) 成本。如果与您需要执行的所有 contains() 检查的总成本相比,构建 HashSet 的成本可以忽略不计,您只会获得任何 yield 。试图建立一个没有重复的列表就是这样的情况。


* () 实现 hashCode() 最好通过异或(^ 运算符)您用于 equals 实现的相同字段的 hashCode 来完成(但 multiply by 31 以减少 XOR 产生 0 的机会)

关于java - 在 Java 中查看 ArrayList 是否包含对象的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/558978/

相关文章:

java - 如何跳过扩展抽象类的类中的一个方法?

java - 使用来自 AsyncTask 的响应作为回调

java - 将 guice 与 javafx 和 hibernate 一起使用

algorithm - 如何表示用于地理位置查找的街道地址范围?

javascript - 如何循环数据并在执行一定次数后等待

algorithm - 对具有修改成本的数字列表进行排序

optimization - 支持向量机原始形式实现

java - 从 Java 访问 Javadoc 的库

javascript - 优化此 Javascript 代码

c - 字符串引用是否重复?