我在 Java 中有一个对象的 ArrayList。这些对象有四个字段,其中两个我会用来认为对象等于另一个。鉴于这两个字段,我正在寻找最有效的方法来查看数组是否包含该对象。
关键是这些类是基于 XSD 对象生成的,所以我不能修改类本身来覆盖 .equals
。
有没有比循环遍历并手动比较每个对象的两个字段然后在找到时中断更好的方法?就是这么乱,找个更好的办法。
编辑: ArrayList 来自未编码为对象的 SOAP 响应。
最佳答案
这取决于您需要的效率。简单地遍历列表以查找满足特定条件的元素是 O(n),但如果您可以实现 Equals 方法,则 ArrayList.Contains 也是如此。如果您不是在循环或内部循环中执行此操作,那么这种方法可能就可以了。
如果您确实需要不惜一切代价实现非常高效的查找速度,您需要做两件事:
- 解决该类 生成:编写一个适配器类 可以包装生成的类和 实现equals()基于 在这两个领域(假设他们 是公开的)。别忘了还有 实现hashCode() (*)
- 用该适配器包装每个对象,然后 把它放在一个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/