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()方法吗?

您没有覆盖类中的方法。 为了覆盖,方法参数也必须是相同类型。

它应该是

 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()具有兼容的语义。