90.    Igualdad (==)

Java define el operador de igualdad sobre todo tipo de datos

a == b

Tipos primitivos

devuelve TRUE si los valores de a y b son idénticos.

OJO: La igualdad está muy bien definida para enteros, booleanos y caracteres; pero deja que desear en el caso de valores reales. Comparar dos reales es chequear que son idénticos hasta el último decimal, lo que puede dar resultados extraños si  hay errores de redondeo. En el caso de números reales es mejor escribir código del tipo

                Math.abs(a -b) < ERROR

                donde ERROR especifica la precisión de la comparación.

Objetos, incluidos arrays

                devuelve TRUE si se refieren al mismo objeto.

Si interesa comparar el contenido de los objetos, conviene recurrir a un método específico que, por convenio, se suele denominar “equals”.

En el siguiente ejemplo, dos cartas se consideran "equals" si son del mismo palo y del mismo valor.

class Palo

public enum Palo { Bastos, Copas, Espadas, Oros }

class Carta

public class Carta {

  private Palo palo;

  private int valor;

 

  public Carta(Palo palo, int valor) {

    this.palo = palo;

    this.valor = valor;

  }

 

  @Override

  public boolean equals(Object x) {

    if (x == this) return true;

    if (x == null) return true;

    if (x.getClass() != this.getClass()) return false;

    Carta carta= (Carta)x;

    return this.palo == carta.palo && this.valor == carta.valor;

  }

 

  @Override

  public int hashCode() {

    return palo.ordinal() ^ valor;

  }

}      

class TestCarta

public class TestCarta {

 

    public static void main(String[] args) {

        Carta c1 = new Carta(Palo.Copas, 1);

        Carta c2 = new Carta(Palo.Copas, 1);

        Carta c3 = new Carta(Palo.Copas, 2);

 

        System.out.println("c1 == c1 -> " + (c1 == c1));

        System.out.println("c1 == c2 -> " + (c1 == c2));

        System.out.println("c1.equals(c2) -> " + c1.equals(c2));

        System.out.println("c1 == c3 -> " + (c1 == c3));

        System.out.println("c1.equals(c3) -> " + c1.equals(c3));

    }

}              

ejecución de las pruebas

c1 == c1 -> true

c1 == c2 -> false

c1.equals(c2) -> true

c1 == c3 -> false

c1.equals(c3) -> false

 

Ver “equals()”.

Temas relacionados

Vademécum