Quería aclarar si entiendo esto correctamente:
==
es una comparación de referencia, es decir, ambos objetos apuntan a la misma ubicación de memoria.equals()
evalúa la comparación de valores en los objetos
java
identity
equality
object-comparison
brainydexter
fuente
fuente
.equals()
es significativamente equivalenteRespuestas:
En general, la respuesta a su pregunta es "sí", pero ...
.equals(...)
solo comparará lo que está escrito para comparar, ni más ni menos.equals(Object o)
método predeterminado es la clase principal más cercana que ha anulado este método.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, probará la igualdad de objetos y no la igualdad funcional .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 susequals
métodos muestran que son equivalentes. Lo contrario no es necesariamente cierto.fuente
==
busca referencias de memoria, entonces ¿por qué obtengo este comportamiento extraño en [this] [1] [1]: docs.google.com/document/d/… Esperaba que la salida fuera verdadera. puede aclarar mis confusionesThe equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
<br/>Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
( docs.oracle.com/javase/7/docs/api/java/lang/… )Con respecto a la clase String:
El método equals () 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 hay 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 la misma instancia de String . Si el valor de ambas referencias de objeto "se refieren" a la misma instancia de String, el resultado de la expresión booleana sería "verdadero" ... duh. Si, por otro lado, el valor de ambas referencias de objeto "se refiere a" instancias de String diferentes (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".
Como con cualquier explicación, deja que se hunda.
Espero que esto aclare las cosas un poco.
fuente
String
s, la==
referencia también es igual, sí, pero por lo general funciona (como en dosString
s con el mismo contenido generalmente serán==
entre sí), debido a cómo Java manejaString
s. No siempre será así, y ciertamente es una mala práctica, pero es un error común, particularmente de personas que vienen de otros idiomas.String
La compilación de cadena literal se agregará a algo llamadoString constant pool
, por ejemplo,String s1 = "someString"; String s2 = "someString;"
amboss1
ys2
compartirán la misma referencia.s1 == s2
volverá verdadero. Pero si se construyeron a través deString constructor
, por ejemploString s1 = new String("someString"); String s2 = new String("someString");
, no compartirán la misma referencia.s1 == s2
devolverá falso.Hay algunas pequeñas diferencias dependiendo de si estás hablando de "primitivas" o "tipos de objetos"; lo mismo se puede decir si se trata de miembros "estáticos" o "no estáticos"; también puedes mezclar todo lo anterior ...
Aquí hay un ejemplo (puedes ejecutarlo):
Puede comparar las explicaciones para "==" (Operador de igualdad) y ".equals (...)" (método en la clase java.lang.Object) a través de estos enlaces:
fuente
La diferencia entre == e igual me confundió durante algún tiempo hasta que decidí echarle un vistazo más de cerca. Muchos de ellos dicen que para comparar cadenas debe usar
equals
y no==
. Espero que en esta respuesta pueda decir la diferencia.La mejor manera de responder a esta pregunta será haciéndose algunas preguntas. así que empecemos:
¿Cuál es la salida para el siguiente programa:
si usted dice,
Diré que tienes razón, pero ¿por qué dijiste eso ? y si dices que la salida es,
Diré que estás equivocado pero aún te preguntaré, ¿por qué crees que eso es correcto?
Ok, intentemos responder a esta:
¿Cuál es la salida para el siguiente programa:
Ahora si dices,
Diré que estás equivocado, pero ¿por qué está mal ahora ? la salida correcta para este programa es
Compare el programa anterior y trate de pensarlo.
Okay. Ahora esto podría ayudar (lea esto: imprima la dirección del objeto ; no es posible, pero aún así podemos usarlo).
¿Puedes tratar de pensar en la salida de las últimas tres líneas en el código anterior? Para mí, ideone imprimió esto ( puedes consultar el código aquí ):
Oh! Ahora ve que identityHashCode (mango) es igual a identityHashCode (mango2) Pero no es igual a identityHashCode (mango3)
A pesar de que todas las variables de cadena - mango, mango2 y mango3 - tienen el mismo valor, que es "mango",
identityHashCode()
todavía no es el mismo para todos.Ahora intenta descomentar esta línea
// mango2 = "mang";
y ejecútala de nuevo esta vez, verás que las tresidentityHashCode()
son diferentes. Hmm eso es una pista útilsabemos que si
hashcode(x)=N
yhashcode(y)=N
=>x is equal to y
No estoy seguro de cómo funciona Java internamente, pero supongo que esto es lo que sucedió cuando dije:
Java creó una cadena
"mango"
que fue señalada (referenciada) por la variablemango
algo como estoAhora en la siguiente línea cuando dije:
En realidad reutilizó la misma cadena
"mango"
que se parece a estoTanto mango como mango2 apuntan a la misma referencia Ahora cuando dije
En realidad, creó una referencia (cadena) completamente nueva para "mango". que se parece a esto,
y es por eso que cuando pongo los valores para
mango == mango2
, sacatrue
. y cuando puse el valor paramango3 == mango2
, pusefalse
(incluso cuando los valores eran los mismos).y cuando descomentaste la línea
// mango2 = "mang";
, en realidad creó una cadena "mang" que convirtió nuestro gráfico de esta manera:Es por eso que identityHashCode no es el mismo para todos.
Espero que esto les ayude chicos. En realidad, quería generar un caso de prueba donde == falla y pasa igual (). Por favor, siéntase libre de comentar y avíseme si estoy equivocado.
fuente
mango == mango2
Ocurre porque no creastemango2
como un nuevo objeto String y en su lugar solo hiciste referencia directa"mango"
?Salud :-)
fuente
Tendrá que anular la función igual (junto con otras) para usar esto con clases personalizadas.
El método igual compara los objetos.
El
==
operador binario compara las direcciones de memoria.fuente
Ambos == y .equals () se refieren al mismo objeto si no anula .equals ().
Es tu deseo lo que quieres hacer una vez que anulas .equals (). Puede comparar el estado del objeto que invoca con el estado del objeto pasado o simplemente puede llamar a super.equals ()
fuente
==
es un operador yequals()
es un método .Los operadores se usan generalmente para comparaciones de tipos primitivos y, por lo tanto,
==
se usan para comparar direcciones de memoria y elequals()
método se usa para comparar objetos .fuente
fuente
Solo recuerde que
.equals(...)
tiene que ser implementado por la clase que está tratando de comparar. De lo contrario, no hay mucho punto; la versión del método para la clase Object hace lo mismo que la operación de comparación: Object # es igual a .La única vez que realmente desea utilizar el operador de comparación para objetos es cuando compara Enums. Esto se debe a que solo hay una instancia de un valor Enum a la vez. Por ejemplo, dada la enumeración
Nunca tendrá más de una instancia
A
a la vez, y lo mismo paraB
yC
. Esto significa que puedes escribir un método como este:Y no tendrás ningún problema en absoluto.
fuente
Cuando evalúa el código, queda muy claro que (==) se compara de acuerdo con la dirección de memoria, mientras que igual (Object o) compara el hashCode () de las instancias. Es por eso que se dice que no rompa el contrato entre equals () y hashCode () si no enfrenta sorpresas más tarde.
fuente
Aquí hay una regla general para la diferencia entre
relational operator ==
ythe method .equals()
.object1 == object2
compara si los objetos a los que hace referencia object1 y object2 hacen referencia a la misma ubicación de memoria en Heap .object1.equals(object2)
compara los valores de object1 y object2 independientemente de dónde se encuentren en la memoria .Esto se puede demostrar bien usando String
escenario 1
Escenario 2
Esta comparación de cadenas podría usarse como base para comparar otros tipos de objetos.
Por ejemplo, si tengo una clase de Persona , necesito definir la base de criterios en la que compararé a dos personas . Digamos que esta clase de persona tiene variables de instancia de altura y peso.
Por lo tanto, crear objetos personales
person1 and person2
y comparar estos dos utilizando el método.equals()
Necesito anular el método de igualdad de la clase de persona para definir en función de qué variables de instancia (altura o peso) será la comparación.Sin embargo, el
== operator will still return results based on the memory location of the two objects(person1 and person2)
.Para facilitar la generalización de esta comparación de objetos personales, he creado la siguiente clase de prueba. Experimentar con estos conceptos revelará toneladas de hechos .
El resultado de esta ejecución de clase es:
fuente
También tenga en cuenta que
.equals()
normalmente contiene==
para probar, ya que es lo primero que desea probar si desea probar si dos objetos son iguales.Y, de
==
hecho, analiza los valores para los tipos primitivos, para los objetos verifica la referencia.fuente
== operador referencia siempre se compara. Pero en caso de
depende de la implementación si se reemplaza el método igual al que compara el objeto en la implementación básica dada en el método reemplazado.
en el código anterior, tanto el objeto obj como el obj1 contienen los mismos datos, pero la referencia no es la misma, por lo que es igual que return false y == también. pero si anulamos el método es igual a
saber, verificará que devolverá verdadero y falso para el mismo caso solo que anulamos
compara el objeto en la base del contenido (id) del objeto
Todavía comparar referencias de objeto.
fuente
La principal diferencia entre == y equals () es
1) == se usa para comparar primitivas.
Por ejemplo :
2) equals () se usa para comparar objetos. Por ejemplo :
fuente
==
se puede usar en muchos tipos de objetos, pero se puede usarObject.equals
para cualquier tipo, especialmente cadenas y marcadores de mapa de Google.fuente
---- Salida ----- verdadero falso verdadero
fuente
Puede valer la pena agregar que para los objetos de contenedor para tipos primitivos, es decir, Int, Long, Double - == devolverá verdadero si los dos valores son iguales.
Por el contrario, al poner los dos Longs anteriores en dos ArrayLists separadas, igual los ve como iguales, pero == no.
fuente
Long a = 128l; Long b = 128l; System.out.println(a == b);
El conjunto de cadenas (también conocido como internados ) y el conjunto de enteros difuminan aún más la diferencia y pueden permitirle usar
==
objetos en algunos casos en lugar de.equals
Esto puede brindarle un mayor rendimiento (?), A costa de una mayor complejidad.
P.ej:
Compensación de complejidad: lo siguiente puede sorprenderlo:
Le aconsejo que se mantenga alejado de dicha microoptimización, y que siempre use
.equals
para objetos y==
primitivas:fuente
En resumen, la respuesta es "Sí".
En Java, el
==
operador compara los dos objetos para ver si apuntan a la misma ubicación de memoria; mientras que el.equals()
método en realidad compara los dos objetos para ver si tienen el mismo valor de objeto.fuente
Básicamente,
==
compara si dos objetos tienen la misma referencia en el montón, por lo que a menos que dos referencias estén vinculadas al mismo objeto, esta comparación será falsa.equals()
Es un método heredado de laObject
clase. Este método compara por defecto si dos objetos tienen la misma referencia. Significa:object1.equals(object2)
<=>object1 == object2
Sin embargo, si desea establecer la igualdad entre dos objetos de la misma clase, debe anular este método. También es muy importante anular el método
hashCode()
si se ha anuladoequals()
.Implemente
hashCode()
cuando el establecimiento de la igualdad sea parte del Contrato de objetos Java. Si está trabajando con colecciones y no ha implementadohashCode()
, Strange Bad Things podría suceder:null
se imprimirá después de ejecutar el código anterior si no lo ha implementadohashCode()
.fuente
Dado que Java no admite la sobrecarga del operador, == se comporta de manera idéntica para cada objeto, pero el método equals (), que se puede anular en Java, y la lógica para comparar objetos se puede cambiar según las reglas comerciales.
La principal diferencia entre == y equals en Java es que "==" se usa para comparar primitivas, mientras que el método equals () se recomienda para verificar la igualdad de los objetos.
La comparación de cadenas es un escenario común de uso del método tanto == como igual. Dado que la clase java.lang.String reemplaza el método igual, devuelve verdadero si dos objetos String contienen el mismo contenido, pero == solo devolverá verdadero si dos referencias apuntan al mismo objeto.
Aquí hay un ejemplo de comparación de dos cadenas en Java para la igualdad usando el método == y equals () que aclarará algunas dudas:
fuente