如何在Java中编写自己的比较运算符?

时间:2011-09-13 17:41:09

标签: java

我有List<MyObject> list

并且,我希望利用list.contains()函数。

此刻似乎不起作用,即列表中的对象匹配,但比较器操作员没有拾取。

我猜我需要在MyObject中编写自己的比较运算符。这是怎么回事?

5 个答案:

答案 0 :(得分:6)

您需要覆盖public boolean equals(Object o)因为contains使用它:

  

boolean contains(Object o)

     

如果此collection包含指定的元素,则返回true。更正式地说,当且仅当此集合包含至少一个元素e (o==null ? e==null : o.equals(e))时才返回true。

有关覆盖equals的简单而正确的方法的讨论,请参阅How to implement hashCode and equals method

您需要特别小心覆盖equals(Object o),而不是仅仅实施equals(MyObject o)

答案 1 :(得分:0)

您必须覆盖equals()中的MyObject

public class MyObject
{

     public boolean equals(Object obj)
     {
          if(this == obj)
               return true;
          if((obj == null) || (obj.getClass() != this.getClass()))
               return false;
          // object must be MyObject at this point
          MyObject test = (MyObject) obj;

          // Compare 'this' MyObject to 'test'

     }

     public int hashCode()
     {
          // generate your hash
     }
}

答案 2 :(得分:0)

您只需在MyObject类上实现自己的equals和hashcode版本。

默认等于不会检查您在类中定义的属性。这就是你得到错误结果的原因。

答案 3 :(得分:0)

你的班级需要实现equals()。如果你想对对象进行排序,那么实现Comparable接口也很有用。

class MyObject implements Comparable<MyObject> {
   public int compareTo(MyObject o) {
       // do the compare!
   }

   public boolean equals(Object o) {
      // check equality
   }

}

答案 4 :(得分:0)

请注意List的contains方法的文档: List.contains()

它声明它使用 equals 方法来确定相等性,从而确定该元素是否存在于列表中。

另请注意,当您超载等于时,您必须重载 hashCode