Почему equals возвращает false в моем java-коде?

#java #equals

#java #equals

Вопрос:

Я не понимаю, почему equals() возвращает «false» вместо «true» в моем коде?

 class Location {

    private int x, y;

    public Location(int x, int y) {

        this.x = x;
        this.y = y;
    }
}

public class App {

    public static void main(String[] args) {

        Location a = new Location(1, 2); //
        Location b = new Location(1, 2); // same values

        System.out.println(a.equals(b)); // result : "false"
    }
}
  

Как сравнить значения двух объектов?

Комментарии:

1. Вам нужно переопределить метод equals() . Вы также должны сделать то же самое для hashcode()

2. И, кстати, java.awt.Point по сути такой же, как и ваш класс здесь

Ответ №1:

Переопределите базовый метод equals следующим образом:

 @Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Location that = (Location) o;
    return x.equals(that.x) amp;amp;
      y.equals(that.y);
}
  

Комментарии:

1. Но вы не можете этого сделать .equals() на примитивных int s, не так ли?

2. Это введено в более новой версии Java, чем 8? Мой компилятор говорит, Cannot invoke equals(int) on the primitive type int' .

3. @FredLarson Я думаю, лучшей практикой было бы == тогда. Раньше это позволяло вам использовать .equals() для сравнения целых чисел в более ранних версиях.

Ответ №2:

Переопределение equals() метода похоже на процедуру. Вы можете использовать инструменты IDE для генерации equals() hashcode() методов и .

     @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Location other = (Location) obj;
        if (!getEnclosingInstance().equals(other.getEnclosingInstance()))
            return false;
        if (x != other.x)
            return false;
        if (y != other.y)
            return false;
        return true;
    }
  

Ответ №3:

Этот метод определен в классе Object, так что каждый объект Java наследует его. По умолчанию его реализация сравнивает адреса памяти объектов, поэтому он работает так же, как оператор == . Однако мы можем переопределить этот метод, чтобы определить, что означает равенство для наших объектов.

Вы должны переопределить метод equals() для этого класса, чтобы мы могли сравнить два местоположения на основе их внутренних деталей:

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Location that = (Location) o;
        return x.equals(that.x) amp;amp;
          y.equals(that.y);
    }