我有一些对象
class A {
private Long id;
private String name;
public boolean equals(Long v) {
return this.id.equals(v);
}
}
和这些对象的ArrayList。 我想要的是能够检查该列表是否包含一个按对象的字段的对象。 例如:
ArrayList<A> list = new ArrayList<A>(); if (list.contains(0L)) {...}
但是压倒的Equals方法对我没有帮助。我做错了什么? 谢谢
更新 我应该覆盖hashcode()方法吗?
答案 0 :(得分:47)
这里有一些代码可能会证明它是如何工作的:
import java.util.ArrayList;
class A {
private Long id;
private String name;
A(Long id){
this.id = id;
}
@Override
public boolean equals(Object v) {
boolean retVal = false;
if (v instanceof A){
A ptr = (A) v;
retVal = ptr.id.longValue() == this.id;
}
return retVal;
}
@Override
public int hashCode() {
int hash = 7;
hash = 17 * hash + (this.id != null ? this.id.hashCode() : 0);
return hash;
}
}
public class ArrayList_recap {
public static void main(String[] args) {
ArrayList<A> list = new ArrayList<A>();
list.add(new A(0L));
list.add(new A(1L));
if (list.contains(new A(0L)))
{
System.out.println("Equal");
}
else
{
System.out.println("Nah.");
}
}
}
首先,重写equals(Object o)方法。然后还有hashCode()的覆盖。另请注意,检查等号的实例将确保您不会尝试比较不同的对象。
应该这样做!希望它有所帮助!干杯:)
答案 1 :(得分:8)
您没有覆盖班级中的方法。为了覆盖,方法参数也必须是相同的类型。
应该是
public boolean equals(Object o) {
}
在你的情况下,它是
public boolean equals(Long o) {
}
你可能需要这样做
public boolean equals(Object o)
{
if (o == null) return false;
if (o == this) return true; //if both pointing towards same object on heap
A a = (A) o;
return this.id.equals(a.id);
}
答案 2 :(得分:7)
我做错了什么?
你没有压倒一切。你正在超载。
contains
方法使用签名equals
调用equals(Object)
方法,因此您添加的此(新)方法不会被调用。
另一个问题是您的equals
方法对contains
的语义错误。 contains
方法需要将this
与可能是列表成员的对象进行比较。您的列表不包含Long
个对象。它包含A
类型的对象。
现在你可以逃避这个...如果你使用原始列表类型......但你要做的是违反API合同和不良做法。更好的解决方案是明确地迭代和测试列表的元素。
我是否应该覆盖hashcode()方法呢?
如果覆盖equals(Object)
,那么您还应该覆盖hashcode()
。
这里没有任何区别,但是如果你将A
个对象放入散列数据结构中,这一点至关重要。由于您不知道下一个人将如何处理您的代码,因此最好确保equals(Object)
和hashCode()
具有兼容的语义。