¿Cómo funciona el método toString()
, el operador ==
y el método equals()
de manera diferente o similar en los tipos de referencia y primitivo?¿Cómo funcionan los métodos del objeto toString(), ==, equals() de manera diferente o similar en los tipos de referencia y primitivo?
Respuesta
Para los tipos de referencia, == comparará la referencia real (donde reside el objeto en la memoria) donde el método igual realiza una comparación de los datos.
La JVM algunas veces "interpondrá en secuencia" sus cadenas inmutables por motivos de rendimiento. Causando esto:
String a = "abc";
String b = "abc";
if (a == b){
//The if statement will evaluate to true,
//if your JVM string interns a and b,
//otherwise, it evaluates to false.
}
El operador '==' trabaja en el tipo primitivo que tiene, que en el caso de los objetos de referencia es la propia referencia. Eso es a == b
comparará los valores para tipos primitivos como int, pero comparará la referencia (no el valor) para los tipos de referencia. Dos objetos de tipo de referencia que no son iguales pero tienen el mismo valor devolverán true
cuando se llame al método equals()
, pero a == b
será falso.
Para tipos primitivos, al llamar a un método, el tipo se convierte previamente (en recuadro) a un tipo de referencia y luego se llama al método. Esto significa que para los tipos primitivos a == b
obtendrá el mismo valor que a.equals(b)
, pero en este último caso se crean dos objetos temporales en caja antes de llamar al método equals()
. Esto hará que la operación sea más costosa en tiempo de CPU, lo que puede o no ser un problema dependiendo de dónde ocurra.
Es decir, para comparar los valores de tipo primitivo debe usar ==
, mientras que para comparar los valores de tipo de referencia, debe usar el método .equals()
.
Lo mismo ocurre con el método toString()
. Cuando se invoca a un objeto de tipo de referencia, llamará al método apropiado y producirá una Cadena. Cuando se invoca en un tipo primitivo, el tipo se autocapturará y luego se llamará al método en el objeto temporal. En este caso, puede llamar al método estático toString()
apropiado (es decir, para la llamada internacional Integer.toString(myint)
), esto evitará la creación del objeto temporal.
'a.equals (b)' no se compilará si 'a' es de tipo primitivo. – ajb
Para los tipos regulares (incluyendo String):
==
compara referencias a objetos. Prueba si dos referencias de objeto son iguales; es decir, si se refieren al mismo objeto.equals(Object)
prueba si este objeto es "igual a" otro. Qué significa "igual a" depende de cómo la clase del objeto define la igualdad. La clasejava.lang.Object
defineequals(other)
comothis == other
, pero muchas clases anulan esta definición.toString()
proporciona una conversión simple del objeto a una Cadena. El formato y contenido de la Cadena resultante es específico de la clase y (desde la perspectiva del contratojava.lang.Object
) no hay garantías de que sea significativo.
Para (true) tipos primitivos:
==
compara valores del tipo, yequals()
ytoString()
no están definidas. Java no le permite llamar a un método en un valor primitivo.
Sin embargo, esto se complica por el hecho de que en algunos contextos el lenguaje Java dice que un tipo primitivo puede ser "autoboxed" para dar una instancia de tipo correspondiente de la envoltura del tipo primitivo; p.ej. int
corresponde a java.lang.Integer
, y así sucesivamente. Para las clases de envoltura:
==
se define el mismo que para cualquier otro tipo de referencia,equals()
compara los valores envueltos, ytoString()
formatea los valores envueltos.
El palo en la rueda es ilustrado por el siguiente:
int a = ...
int b = a;
Integer aa = a; // autoboxing occurs
Integer bb = b; // autoboxing occurs
assert a == b; // always succeeds
assert aa.equals(bb); // always succeeds
assert aa == bb; // sometimes succeeds, sometimes fails.
La razón de que el último a veces falla es que el JLS no garantiza que autoboxing un valor simple dado siempre dará el mismo envoltorio objeto. En algunos casos (por ejemplo, para enteros pequeños), y no para otros (por ejemplo, enteros grandes).
La lección que debe aprenderse del ejemplo anterior es que debe tener mucho cuidado con el uso de ==
en un tipo de referencia. Úselo únicamente cuando realmente desea probar si dos referencias son para el mismo objeto. No lo use si solo quiere probar si los objetos son "iguales" sin la sobrecarga de llamar al equals()
.
(También tenga en cuenta que es otro tipo String
==
donde se va a dar la respuesta equivocada en muchas situaciones; ver How do I compare strings in Java?.)
'==' en primitivas solo verifica los valores e ignora los tipos. 'int x = 5; largo y = 5L; byte b = 5; x == y; b == x; 'Ambos devuelven verdadero. – arun
No está "ignorando" los tipos. Uno u otro de los operandos se promociona al tipo del otro. Además, dije "valores del tipo" ... –
- 1. Generar pruebas unitarias para los métodos hashcode, equals y toString
- 2. Cómo .NET diferencia los tipos de referencia frente a primitivo y de valor
- 3. Objeto o tipo primitivo
- 4. ¿Por qué los literales de los números no tienen acceso a los métodos numéricos?
- 5. JavaScript: Diferencia entre los métodos toString() y toLocaleString() de Fecha
- 6. ¿Cómo funcionan los métodos asíncronos en C#?
- 7. ¿Cómo funcionan los métodos virtuales en C#?
- 8. ¿Es una matriz un tipo primitivo o un objeto (o algo completamente diferente)?
- 9. ¿Cuáles son las diferencias entre los tipos de valores y los tipos de referencia en C#?
- 10. ¿Cómo funcionan los tipos que aceptan nulos en C#?
- 11. ¿Los tipos de referencia son tipos anulables?
- 12. Generando equals/hashcode/toString usando la anotación
- 13. ¿Cómo funcionan los eventos débiles?
- 14. Cómo funcionan los tipos de parámetros covariantes en java
- 15. ¿Cómo funcionan los constructores estáticos para los tipos genéricos?
- 16. ¿Cuál es la "mejor" implementación canónica de Equals() para los tipos de referencia?
- 17. Los tipos de retorno covariantes de Java no funcionan para anular los métodos de una instancia enum?
- 18. convención de Java en referencia a los métodos y variables
- 19. ¿Cómo puedo obtener checkstyle para omitir los métodos equals() y hashcode() generados por eclipse?
- 20. ¿Cómo puedo ocultar los métodos en F #?
- 21. Symfony2: ¿objeto de referencia similar al objeto de solicitud?
- 22. ¿Es mejor utilizar los métodos getter o acceder a los campos privados directamente al anular toString?
- 23. ¿Cómo se obtiene la "referencia de objeto" de un objeto en java cuando toString() y hashCode() se han anulado?
- 24. ¿Cómo funcionan los métodos estáticos sincronizados en Java?
- 25. C# == es diferente en tipos de valores y tipos de referencia?
- 26. ¿Cómo funcionan los frameworks simulados?
- 27. Obteniendo los tipos de los atributos en un objeto ActiveRecord
- 28. ¿Cómo usar los tipos de objeto singleton de Scala?
- 29. Los tipos de referencia viven en el montón, los tipos de valor viven en la pila
- 30. En C#, el uso de los tipos de valor frente a los tipos de referencia
aprendieron un nuevo concepto - internar! – lft93ryt