ArrayList的自定义Contains方法
我有一些对象
class A { private Long id; private String name; public boolean equals(Long v) { return this.id.equals(v); } }
和这些对象的ArrayList。 我想要的是能够检查该列表是否包含一个按对象的字段的对象。 例如:
ArrayList list = new ArrayList(); if (list.contains(0L)) {...}
但是压倒Equals的方法对我没有帮助。 我做错了什么? 谢谢
更新我应该覆盖hashcode()方法吗?
这里有一些代码可以演示它是如何工作的:
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 list = new ArrayList(); 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()的覆盖。 另请注意,检查等于的实例将确保您不会尝试比较不同的对象。
这应该够了吧! 希望它有所帮助! 干杯:)
您没有覆盖类中的方法。 为了覆盖,方法参数也必须是相同类型。
它应该是
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); }
我做错了什么?
你没有压倒一切。 你正在超载。
contains
方法使用签名equals(Object)
调用equals
方法,因此不会调用您添加的此(新)方法。
另一个问题是你的equals
方法对于contains
有错误的语义。 contains
方法需要将this
与可能是列表成员的对象进行比较。 您的列表不包含Long
对象。 它包含A
类型A
对象。
现在你可以逃避这个…如果你使用原始列表类型……但你要做的是违反API合同和不良做法。 更好的解决方案是显式迭代和测试列表的元素。
我应该覆盖hashcode()方法吗?
如果重写equals(Object)
那么你也应该覆盖hashcode()
。
它在这里没有任何区别,但是如果你把A
对象放入散列数据结构中则必不可少。 而且由于您不知道下一个人将如何处理您的代码,因此最好确保equals(Object)
和hashCode()
具有兼容的语义。