我在 Java 中有一个 ArrayList,它由包含两个字符串和一个整数的类型组成。我可以成功测试此 ArrayList 的一个元素是否等于另一个元素,但我发现 contains 方法失败。我相信这是因为我的类型不是原始类型。
现在我看到了两个替代方案,我想知道哪个是最好的选择:
通过遍历 ArrayList 并测试每个元素与我要查找的元素的相等性然后中断循环来实现我自己的 contains 方法。
或者使用我的类型的 HashMap 作为键,使用整数作为值而不是 ArrayList。在这里,我可以使用方法 containsKey 来检查某个元素是否已存在于 HashMap 中。
方法 #2 的唯一警告是在我的案例中该值在很大程度上是多余的。
最佳答案
很可能,您只是忘记了在您的类型中覆盖 equals()
和 hashCode()
。 equals()
是 contains()
检查的内容。
来自Javadoc :
Returns
true
if this list contains the specified element. More formally, returnstrue
if and only if this list contains at least one elemente
such that(o==null ? e==null : o.equals(e))
.
自 equals
的默认实现以来测试引用相等性,它不适合像这样的自定义数据类型。
(如果您没有重写 equals
和 hashCode
,使用您的类型作为 HashMap
中的键同样是徒劳的。)
编辑:请注意,要覆盖,您必须提供准确签名。
class MyDataType {
public boolean equals(MyDataType other) { // WRONG!
...
}
public boolean equals(Object other) { // Right!
...
}
}
这是使用 @Override
的一个非常有力的论据注解;如果使用 @Override
注释,第一个示例将在编译时失败。
关于java - 在 Java 的 ArrayList 中使用包含的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/986924/