Solución:
En general, la respuesta a su pregunta es “sí”, pero …
-
.equals(...)
Solo compararé lo que está escrito para comparar, ni más ni menos. - Si una clase no anula el método equals, entonces toma el valor predeterminado
equals(Object o)
método de la clase principal más cercana que ha anulado este método. - Si ninguna clase principal ha proporcionado una anulación, entonces el método predeterminado es el de la última clase principal, Objeto, y por lo tanto, se queda con el
Object#equals(Object o)
método. Según la API de objetos, esto es lo mismo que==
; es decir, devuelve verdadero si y solo si ambas variables se refieren al mismo objeto, si sus referencias son una y la misma. Por lo tanto, estarás probando igualdad de objeto y no igualdad funcional. - Recuerde siempre anular
hashCode
si anulaequals
para no “romper el contrato”. Según la API, el resultado devuelto por elhashCode()
método para dos objetos debe ser el mismo si suequals
Los métodos muestran que son equivalentes. Lo contrario es no necesariamente cierto.
Con respecto a la clase String:
Los iguales () método compara el “valor” dentro de las instancias de String (en el montón) independientemente de si las dos referencias de objeto se refieren a la misma instancia de String o no. Si dos referencias de objetos de tipo String se refieren a la misma instancia de String, ¡genial! Si las dos referencias de objeto se refieren a dos instancias de String diferentes … no hace ninguna diferencia. Es el “valor” (es decir: el contenido de la matriz de caracteres) dentro de cada instancia de String que se está comparando.
Por otro lado, el “==” operador compara el valor de dos referencias de objeto para ver si se refieren a lo mismo Instancia de cadena. Si el valor de ambas referencias de objeto “se refiere” a la misma instancia de String, entonces el resultado de la expresión booleana sería “verdadero” … duh. Si, por el contrario, el valor de ambas referencias de objeto “se refieren a” diferentes instancias de String (aunque ambas instancias de String tienen “valores” idénticos, es decir, el contenido de las matrices de caracteres de cada instancia de String es el mismo), el resultado de la expresión booleana sería “falso”.
Al igual que con cualquier explicación, déjelo asimilar.
Espero que esto aclare las cosas un poco.
Hay algunas pequeñas diferencias dependiendo de si se trata de “primitivos” o de “tipos de objeto”; se puede decir lo mismo si se habla de miembros “estáticos” o “no estáticos”; también puedes mezclar todo lo anterior …
Aquí hay un ejemplo (puede ejecutarlo):
public final class MyEqualityTest
{
public static void main( String args[] )
{
String s1 = new String( "Test" );
String s2 = new String( "Test" );
System.out.println( "n1 - PRIMITIVES ");
System.out.println( s1 == s2 ); // false
System.out.println( s1.equals( s2 )); // true
A a1 = new A();
A a2 = new A();
System.out.println( "n2 - OBJECT TYPES / STATIC VARIABLE" );
System.out.println( a1 == a2 ); // false
System.out.println( a1.s == a2.s ); // true
System.out.println( a1.s.equals( a2.s ) ); // true
B b1 = new B();
B b2 = new B();
System.out.println( "n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
System.out.println( b1 == b2 ); // false
System.out.println( b1.getS() == b2.getS() ); // false
System.out.println( b1.getS().equals( b2.getS() ) ); // true
}
}
final class A
{
// static
public static String s;
A()
{
this.s = new String( "aTest" );
}
}
final class B
{
private String s;
B()
{
this.s = new String( "aTest" );
}
public String getS()
{
return s;
}
}
Puede comparar las explicaciones para “==” (Operador de igualdad) y “.equals (…)” (método en la clase java.lang.Object) a través de estos enlaces:
- ==: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
- .equals (…): http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)