?????????:?????????Java?????Object??equals?????????????????????????????????????????????????????????Java????????????????????????????Java????????????????????????ж????????????????????С?

??????

????????????????equals???????????????????????????????????????????????equal???????????

???????Effective Java?????8???У?Josh Bloch???????????????????????????е?????????????????????????equal??????????????????????Bloch????д????

????????????????????????????????????????????????????????????????????????????????equal??????????????

???????Programming in Scala???е??28????????????????????????????????????????????μ???????equal??????????????????????????????????????????Scala?????У???????????????????????Java????????С???????е???????????Programming in Scala?е?????????????????????scala???????Java

???????????????????

????java.lang.Object ??????equals????????????????????????????????????????????????????????д???????equals???????????????????????о????????Java?????2007 paper??????ó??????μ?????????

???????????е?equals?????????????????

??????????????????????????????????????????????????????????????C????????????????ζ????????????????C????????????????????С???????????????????elem1??elem2???????????C?????????????????????elem1.equals(elm2)????ture????????????equals????????????????????п?????????μ??Щ?????

Set hashSet = new java.util.HashSet();
hashSet.add(elem1);
hashSet.contains(elem2);    // returns false!

??????equals?????????????4????????equals???????μ???????壺

????1????????????equals?????????signature??Defining equals with the wrong signature.

????2????????equals????????????hashCode???????Changing equals without also changing hashCode.

????3?????????仯???????equals???塣Defining equals in terms of mutable fields.

????4??????????????equals??????Failing to define equals as an equivalence relation.

????????μ?????????????????????4?????塣

????????1?????????equals?????????signature??

????????????????????Point?????????????????

public class Point {

    private final int x;
    private final int y;

    public Point(int x?? int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    // ...
}

????????????????????????????????????equals???????

// An utterly wrong definition of equals
public boolean equals(Point other) {
  return (this.getX() == other.getX() && this.getY() == other.getY());
}