Ir al contenido principal

Java: equals() vs =

 

En java las referencias son bits que representan la dirección de memoria donde se encuentra un objeto dentro del “Garbage Collectible Heap”. Cuando utilizamos valores y tipos primitivos, lo que se obtiene son los bits que representan dicho valor, ejemplo un int. Luego entonces una variable de un tipo almacena los bits de referencia o los bits que representen los valores primitivos.

Cuando utilizamos “==” lo que estamos comparando son los bits que se encuentran dentro de las variables.

== con objetos


Date a = new java.util.Date();
Date b = new java.util.Date();
Date c = a;
// false, pues el contenido realmente difiere pues ambas variables contienen bits diferentes.
a == b;
// true, pues son los mismos bits de referencia.
c == a;

== Con primitivos

  1. int x = 12; 
  2. int y = 12; 
  3. int z = x; 
  4. x == y; // true pues al ser primitivos, los bits representan el valor que almacenan. 
  5. x == z; // true, son el mismo valor. 

Equals

Como los objetos son bits de referencia, la forma para comparar los objetos (el valor de los atributos o lo que el objeto considere apto para ser comparable) es mediante el método de comparación “equals”.

  1. Date a = new java.util.Date();  
  2. Date b = new java.util.Date();  
  3. Date c = a; 
  4. a.equals(b);// false pues Date genera un timestamp único en cada invocación 
  5. String d = "Hola"; 
  6. String e = "Hola"; 
  7. d.equals(e);// true, el contenido de String es igual. 
  8. c.equals(a); // true, el contenido de ambas variables son idénticas. 

Experimentando con String

Por último si quisiéramos ver la dirección de referencia de un objeto (no precisamente es exactamente la dirección en memoria), bastaría con imprimirlo:

  1. String ob = new String("Hello"); 
  2. System.out.println(ob); 
  3. // imprimiria algo parecido a esto (es un ejemplo) 
  4. String@0x23928323d... 

El código anterior es debido a que los objetos implementan el método “toString”. El cual retorna el valor generado de concatenar el nombre de la clase, símbolo de arroba seguido de el hashCode del objeto. Puedes ver la documentación en la página oficial de Java

getClass().getName() + '@' + Integer.toHexString(hashCode())

Comentarios