.Contains() method not calling Overridden equals method

前端 未结 3 1694
情书的邮戳
情书的邮戳 2020-12-28 15:07

I am having an issue where I make an ArrayList of Foo objects, I override the equals method, and I cannot get the contains method to call the equals method. I have tried ove

3条回答
  •  滥情空心
    2020-12-28 15:40

    This is because your equals() is not symmetric:

    new Foo("ID1").equals("ID1");
    

    but

    "ID1".equals(new Foo("ID1"));
    

    is not true. This violates the equals() contract:

    The equals method implements an equivalence relation on non-null object references:

    • [...]

    • It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.

    It is not reflexive either:

    • It is reflexive: for any non-null reference value x, x.equals(x) should return true.
    Foo foo = new Foo("ID1");
    foo.equals(foo)  //false!
    

    @mbockus provides correct implementation of equals():

    public boolean equals(Object o){
      if(o instanceof Foo){
        Foo toCompare = (Foo) o;
        return this.id.equals(toCompare.id);
      }
      return false;
    }
    

    but now you must pass instance of Foo to contains():

    System.out.println(fooList.contains(new Foo("ID1")));
    System.out.println(fooList.contains(new Foo("ID2")));
    System.out.println(fooList.contains(new Foo("ID5")));
    

    Finally you should implement hashCode() to provide consistent results (if two objects are equal, they must have equal hashCode()):

    @Override
    public int hashCode() {
        return id.hashCode();
    }
    

提交回复
热议问题