我在Java中有一个ArrayList,它由一个包含两个字符串和一个整数的类型组成.我可以成功测试此ArrayList的一个元素是否等于另一个,但我发现contains方法失败.我相信这是因为我的类型不是原始的.
现在我看到两个替代方案,我想知道哪个是最好的选择:
通过迭代ArrayList并测试每个元素与我正在寻找的那个元素的相等性然后打破循环来实现我自己的contains方法.
或者使用我的类型的HashMap作为键,使用整数作为值而不是ArrayList.在这里,我可以使用方法containsKey来检查HashMap中是否已存在元素.
对#2进行处理的唯一警告是,在我的情况下,该值很大程度上是多余的.
Mic*_*ers 23
最有可能的,你只是忘记了重写equals(),并hashCode()在你的类型.equals()是什么contains()检查.
来自Javadoc:
true如果此列表包含指定的元素,则返回.更正式地说,true当且仅当此列表包含至少一个e这样的元素时才返回(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!
...
}
}
Run Code Online (Sandbox Code Playgroud)
这是使用@Override注释的一个非常有力的论据; 如果使用注释,第一个示例在编译时将失败@Override.
Jon*_*eet 14
我的猜测是你只编写了一个"强类型"equals方法而不是覆盖equals(Object).换句话说,如果你有:
public boolean equals(Foo f)
Run Code Online (Sandbox Code Playgroud)
你需要
public boolean equals(Object o)
Run Code Online (Sandbox Code Playgroud)
以及覆盖Object.equals.
这符合"等于工作,但包含不适合,因为你的测试可能会调用强类型的等号,但ArrayList不会.