objects equal diferencia java

diferencia - use equals java



¿Cuál es la diferencia entre== vs equals() en Java? (24)

El operador == comprueba si dos variables tienen las mismas referencias (también conocido como puntero a una dirección de memoria) .

String foo = new String("abc"); String bar = new String("abc"); if(foo==bar) // False (The objects are not the same) bar = foo; if(foo==bar) // True (Now the objects are the same)

Mientras que el método equals () comprueba si dos variables se refieren a objetos que tienen el mismo estado (valores) .

String foo = new String("abc"); String bar = new String("abc"); if(foo.equals(bar)) // True (The objects are identical but not same)

Saludos :-)

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

¿Estoy en lo correcto en mi entendimiento?


== operador siempre se compara la referencia. Pero en caso de

método igual ()

depende de la implementación si estamos anulados por el método igual al que compara el objeto en la implementación básica dada en el método anulado.

class A { int id; String str; public A(int id,String str) { this.id=id; this.str=str; } public static void main(String arg[]) { A obj=new A(101,"sam"); A obj1=new A(101,"sam"); obj.equals(obj1)//fasle obj==obj1 // fasle } }

en el código anterior, tanto el objeto obj como el objeto obj1 contienen los mismos datos pero la referencia no es la misma, por lo que igual devuelve false y == también. pero si anulamos el método igual a

class A { int id; String str; public A(int id,String str) { this.id=id; this.str=str; } public boolean equals(Object obj) { A a1=(A)obj; return this.id==a1.id; } public static void main(String arg[]) { A obj=new A(101,"sam"); A obj1=new A(101,"sam"); obj.equals(obj1)//true obj==obj1 // fasle } }

Sabemos que el registro de salida devolverá verdadero y falso para el mismo caso que solo anulamos

es igual al metodo

Se compara objeto en base de contenido (id) de objeto.

pero ==

Sigo comparando referencias de objeto.


Básicamente, == compara si dos objetos tienen la misma referencia en el montón, por lo tanto, a menos que dos referencias estén vinculadas al mismo objeto, esta comparación será falsa.

equals() es un método heredado de la clase Object . Este método por defecto compara 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 tienes anulaciones equals() .

Implementar hashCode() al establecer la igualdad es parte del Contrato de Objeto de Java. Si está trabajando con colecciones y no ha implementado hashCode() , podrían ocurrir cosas extrañas y extrañas:

HashMap<Cat, String> cats = new HashMap<>(); Cat cat = new Cat("molly"); cats.put(cat, "This is a cool cat"); System.out.println(cats.get(new Cat("molly"));

null se imprimirá después de ejecutar el código anterior si no ha implementado hashCode() .


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 alguna de las dos referencias de objeto de tipo String se refieren a la misma instancia de String, ¡excelente! 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 refiere" a la misma instancia de String, entonces 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" 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".

Como con cualquier explicación, déjalo entrar.

Espero que esto aclare las cosas un poco.


Cuando evalúa el código, es muy claro que (==) se compara de acuerdo con la dirección de la memoria, mientras que es igual a (Objeto o) compara hashCode () de las instancias. Por eso se dice que no rompa el contrato entre equals () y hashCode () si no se enfrenta a sorpresas más adelante.

String s1 = new String("Ali"); String s2 = new String("Veli"); String s3 = new String("Ali"); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); System.out.println("(s1==s2):" + (s1 == s2)); System.out.println("(s1==s3):" + (s1 == s3)); System.out.println("s1.equals(s2):" + (s1.equals(s2))); System.out.println("s1.equal(s3):" + (s1.equals(s3))); /*Output 96670 3615852 96670 (s1==s2):false (s1==s3):false s1.equals(s2):false s1.equal(s3):true */


Dado que Java no admite la sobrecarga de operadores, == se comporta de manera idéntica para cada objeto, pero igual que () es un método, 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 iguales 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 en el que se utilizan los métodos == y equals. Como la anulación de la clase java.lang.String es igual al método, Devuelve true si dos objetos String contienen el mismo contenido, pero == solo devolverá true si dos referencias apuntan al mismo objeto.

Este es un ejemplo de comparación de dos cadenas en Java para la igualdad utilizando el método == y equals () que despejará algunas dudas:

public class TEstT{ public static void main(String[] args) { String text1 = new String("apple"); String text2 = new String("apple"); //since two strings are different object result should be false boolean result = text1 == text2; System.out.println("Comparing two strings with == operator: " + result); //since strings contains same content , equals() should return true result = text1.equals(text2); System.out.println("Comparing two Strings with same content using equals method: " + result); text2 = text1; //since both text2 and text1d reference variable are pointing to same object //"==" should return true result = (text1 == text2); System.out.println("Comparing two reference pointing to same String with == operator: " + result); } }


El operador ==:

El == es un operador relacional en Java que se utiliza para comparar dos operandos. Se utiliza para determinar si los dos operandos son iguales o no. Usando el operador ==, puedes comparar cualquier tipo primitivo como int, char, float y Booleans. Después de la comparación, el operador == devuelve un valor booleano. Si los dos operandos son iguales, el operador == devuelve un valor verdadero. Sin embargo, si los dos operandos no son iguales, devuelve un valor falso. Cuando se usa con objetos, el operador == compara las dos referencias de objetos y determina si se refieren a la misma instancia.

El método .equals ()

equals () es un método disponible en la clase String que se usa para comparar dos cadenas y determinar si son iguales. Este método devuelve un valor booleano como resultado de la comparación. Si las dos cadenas contienen los mismos caracteres en el mismo orden, el método equals () devuelve verdadero. De lo contrario, devuelve un valor falso.

Por ejemplo:

http://goo.gl/Sa3q5Y


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 por defecto es el método equals(Object o) de la clase padre más cercana que haya anulado este método.
  • Si ninguna clase principal ha proporcionado una anulación, entonces el método predeterminado de la clase principal final, Objeto, se queda con el método Object#equals(Object o) . Según la API de objetos, esto es igual 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 la igualdad de objetos y no la igualdad funcional .
  • Siempre recuerde anular el hashCode si anula los equals para no "romper el contrato". Según la API, el resultado devuelto del método hashCode() para dos objetos debe ser el mismo si sus métodos equals muestran que son equivalentes. Lo contrario no es necesariamente cierto.

En general, los operadores equals () y “==” en Java se usan para comparar objetos para verificar la igualdad, pero aquí hay algunas de las diferencias entre los dos:

La principal diferencia entre el método .equals () y el operador == es que uno es un método y el otro es el operador.

Podemos usar los operadores == para la comparación de referencias (comparación de direcciones) y el método .equals () para la comparación de contenido. En palabras simples, == comprueba si ambos objetos apuntan a la misma ubicación de memoria, mientras que .equals () evalúa la comparación de valores en los objetos. Si una clase no anula el método igual, entonces, de manera predeterminada, utiliza el método igual (Objeto o) de la clase primaria más cercana que ha anulado este método. Mira esto para más detalles.


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 método .equals() realidad compara los dos objetos para ver si tienen el mismo valor de objeto.


Hay algunas pequeñas diferencias dependiendo de si se trata de "primitivos" 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):

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 de "==" (Operador de igualdad) y ".equals (...)" (método en la clase java.lang.Object) a través de estos enlaces:


La diferencia entre == y me confundió por 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 en esta respuesta poder decir la diferencia.

La mejor manera de responder esta pregunta será haciéndote algunas preguntas. así que vamos a empezar:

¿Cuál es la salida para el siguiente programa:

String mango = "mango"; String mango2 = "mango"; System.out.println(mango != mango2); System.out.println(mango == mango2);

si usted dice,

false true

Diré que tienes razón, pero ¿por qué dijiste eso ? y si dices que la salida es,

true false

Diré que estás equivocado, pero aun así te preguntaré, ¿por qué crees que eso es correcto?

Ok, vamos a tratar de responder a esto:

¿Cuál es la salida para el siguiente programa:

String mango = "mango"; String mango3 = new String("mango"); System.out.println(mango != mango3); System.out.println(mango == mango3);

Ahora si tu dices

false true

Diré que estás equivocado, pero ¿por qué está mal ahora ? La salida correcta para este programa es

true false

Por favor compare el programa anterior y trate de pensar en ello.

De acuerdo. Ahora esto podría ayudar (lea esto: imprima la dirección del objeto , no es posible, pero aún podemos usarla).

String mango = "mango"; String mango2 = "mango"; String mango3 = new String("mango"); System.out.println(mango != mango2); System.out.println(mango == mango2); System.out.println(mango3 != mango2); System.out.println(mango3 == mango2); // mango2 = "mang"; System.out.println(mango+" "+ mango2); System.out.println(mango != mango2); System.out.println(mango == mango2); System.out.println(System.identityHashCode(mango)); System.out.println(System.identityHashCode(mango2)); System.out.println(System.identityHashCode(mango3));

puede intentar pensar en el resultado de las últimas tres líneas en el código anterior: para mí, ideone imprimió esto ( puede consultar el código aquí ):

false true true false mango mango false true 17225372 17225372 5433634

Oh! Ahora ves que identityHashCode (mango) es igual a identityHashCode (mango2) Pero no es igual a identityHashCode (mango3)

Aunque 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útalo nuevamente esta vez, verás que los tres identityHashCode() son diferentes. Hmm, eso es una pista útil.

sabemos que si hashcode(x)=N y hashcode(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:

mango = "mango";

Java creó una cuerda "mango" que fue señalada (referenciada) por la variable mango algo como esto

mango ----> "mango"

Ahora en la siguiente línea cuando dije:

mango2 = "mango";

En realidad, reutilizó la misma cuerda "mango" que se ve así.

mango ----> "mango" <---- mango2

Tanto mango como mango2 apuntando a la misma referencia Ahora cuando dije

mango3 = new String("mango")

En realidad, creó una referencia (cadena) completamente nueva para "mango". que se ve algo como esto,

mango -----> "mango" <------ mango2 mango3 ------> "mango"

Y es por eso que cuando puse los valores para mango == mango2 , se puso true . y cuando puse el valor para mango3 == mango2 , mango3 == mango2 false (incluso cuando los valores eran los mismos).

y cuando descomentaste la línea // mango2 = "mang"; En realidad creó una cadena "mang" que dio vuelta a nuestro gráfico de esta manera:

mango ---->"mango" mango2 ----> "mang" mango3 -----> "mango"

Es por esto 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 es igual a () pasar. Por favor, siéntase libre de comentar y hágamelo saber si estoy equivocado.


La principal diferencia entre == y es igual a () es

1) == se utiliza para comparar primitivas.

Por ejemplo :

String string1 = "Ravi"; String string2 = "Ravi"; String string3 = new String("Ravi"); String string4 = new String("Prakash"); System.out.println(string1 == string2); // true because same reference in string pool System.out.println(string1 == string3); // false

2) equals () se utiliza para comparar objetos. Por ejemplo :

System.out.println(string1.equals(string2)); // true equals() comparison of values in the objects System.out.println(string1.equals(string3)); // true System.out.println(string1.equals(string4)); // false


Puede valer la pena agregar que para los objetos de envoltorio para tipos primitivos, es decir, Int, Long, Double - == devolverá verdadero si los dos valores son iguales.

Long a = 10L; Long b = 10L; if (a == b) { System.out.println("Wrapped primitives behave like values"); }

Para contrastar, al colocar los dos Longs anteriores en dos ArrayLists separadas, equals los ve como iguales, pero == no lo hace.

ArrayList<Long> c = new ArrayList<>(); ArrayList<Long> d = new ArrayList<>(); c.add(a); d.add(b); if (c == d) System.out.println("No way!"); if (c.equals(d)) System.out.println("Yes, this is true.");


Solo recuerde que .equals(...) debe ser implementado por la clase que está tratando de comparar. De lo contrario, no hay mucho de un punto; la versión del método para la clase Objeto hace lo mismo que la operación de comparación: Object#equals .

La única vez que realmente desea utilizar el operador de comparación para objetos es cuando está comparando Enums. Esto se debe a que solo hay una instancia de un valor Enum a la vez. Por ejemplo, dada la enumeración

enum FooEnum {A, B, C}

Nunca tendrá más de una instancia de A a la vez, y lo mismo para B y C Esto significa que puedes escribir un método así:

public boolean compareFoos(FooEnum x, FooEnum y) { return (x == y); }

Y no tendrás ningún problema en absoluto.


También tenga en cuenta que .equals() normalmente contiene == para pruebas, ya que esto es lo primero que desearía probar si desea probar si dos objetos son iguales.

Y == realidad mira valores para tipos primitivos, para objetos verifica la referencia.


Tanto == como .equals () se refieren al mismo objeto si no reemplaza .equals ().

Es su deseo lo que quiere hacer una vez que anule .equals (). Puede comparar el estado del objeto que invoca con el pasado en el estado del objeto o simplemente puede llamar a super.equals ()


Tendrá que anular la función de igualdad (junto con otras) para usar esto con clases personalizadas.

El método equals compara los objetos.

El operador binario == compara las direcciones de memoria.


== es un operador y equals() es un método .

Los operadores se usan generalmente para comparaciones de tipos primitivos y, por lo tanto, se usa == para la comparación de direcciones de memoria y se usa el método equals() para comparar objetos .


== se puede usar en muchos tipos de objetos, pero puede usar Object.equals para cualquier tipo, especialmente cadenas y marcadores de mapas de Google.


"==" en realidad están comparando las dos referencias de objetos para ver si apuntan al mismo objeto.

"es igual a", que es una "comparación profunda" que compara los valores reales de la cadena.


El conjunto de cadenas (también conocido como interning ) y el conjunto de enteros difuminan la diferencia aún más, y pueden permitirle utilizar == para objetos en algunos casos en lugar de .equals

Esto le puede dar un mayor rendimiento (?), A costa de una mayor complejidad.

P.ej:

assert "ab" == "a" + "b"; Integer i = 1; Integer j = i; assert i == j;

Compensación de complejidad: lo siguiente puede sorprenderlo:

assert new String("a") != new String("a"); Integer i = 128; Integer j = 128; assert i != j;

Le aconsejo que se mantenga alejado de dicha .equals , y siempre use .equals para objetos, y == para primitivos:

assert (new String("a")).equals(new String("a")); Integer i = 128; Integer j = 128; assert i.equals(j);


String w1 ="Sarat"; String w2 ="Sarat"; String w3 = new String("Sarat"); System.out.println(w1.hashCode()); //3254818 System.out.println(w2.hashCode()); //3254818 System.out.println(w3.hashCode()); //3254818 System.out.println(System.identityHashCode(w1)); //prints 705927765 System.out.println(System.identityHashCode(w2)); //prints 705927765 System.out.println(System.identityHashCode(w3)); //prints 366712642 if(w1==w2) // (705927765==705927765) { System.out.println("true"); } else { System.out.println("false"); } //prints true if(w2==w3) // (705927765==366712642) { System.out.println("true"); } else { System.out.println("false"); } //prints false if(w2.equals(w3)) // (Content of 705927765== Content of 366712642) { System.out.println("true"); } else { System.out.println("false"); } //prints true


public class StringPool { public static void main(String[] args) { String s1 = "Cat";// will create reference in string pool of heap memory String s2 = "Cat"; String s3 = new String("Cat");//will create a object in heap memory // Using == will give us true because same reference in string pool if (s1 == s2) { System.out.println("true"); } else { System.out.println("false"); } // Using == with reference and Object will give us False if (s1 == s3) { System.out.println("true"); } else { System.out.println("false"); } // Using .equals method which refers to value if (s1.equals(s3)) { System.out.println("true"); } else { System.out.println("False"); } } }

---- Salida ----- verdadero falso verdadero