如何在Java中编写一个等式方法

Mil*_*ara 5 java equality

考虑将等式方法添加到以下类简单点:

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;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

//我对equals的定义

public boolean equals(Point other) {
  return (this.getX() == other.getX() && this.getY() == other.getY());
}
Run Code Online (Sandbox Code Playgroud)

这种方法有什么问题?乍一看,似乎工作正常:

Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);

Point q = new Point(2, 3);

System.out.println(p1.equals(p2)); // prints true

System.out.println(p1.equals(q)); // prints false
Run Code Online (Sandbox Code Playgroud)

但是,一旦开始将点放入集合中,就会出现问题:

import java.util.HashSet;

HashSet<Point> coll = new HashSet<Point>();
coll.add(p1);

System.out.println(coll.contains(p2)); // prints false
Run Code Online (Sandbox Code Playgroud)

即使p1被添加到它,并且p1和p2是相等的对象,它怎么可能不包含p2?

DwB*_*DwB 8

虽然您应该在实施hashCode()时实施equals(),但这不会导致您的问题.

这不是equals()您正在寻找的方法.equals方法必须始终具有以下签名:"public boolean equals(Object object)".这是一些代码.

public boolean equals(Object object)
{
  if (object == null)
  {
    return false;
  }

  if (this == object)
  {
    return true;
  }

  if (object instanceof Point)
  {
    Point point = (Point)object;
    ... now do the comparison.
  }
  else
  {
     return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

阿帕奇EqualsBuilder类是平等的实现是有用的.该链接是旧版本,但仍适用.

如果你喜欢Apache EqualsBuilder,你可能也会喜欢Apache HashCodeBuilder类.

编辑:更新了标准快捷方式的equals方法示例.