2009-10-29 57 views
61

Cambié los profesores hoy y él declaró que usaba un código extraño para mí. (Dijo que es mejor utilizar .equals y cuando le pregunté por qué, él respondió "porque lo es!")¿Cuál es la diferencia entre ".equals" y "=="?

Así que aquí está un ejemplo:

if (o1.equals(o2)) 
{ 
System.out.println("Both integer objects are the same"); 
} 

En lugar de lo que estoy acostumbrado a:

if (o1 == o2) 
{ 
    System.out.println("Both integer objects are the same"); 
} 

¿Cuál es la diferencia entre los dos. ¿Y por qué es mejor su camino (usando .equals)?

Found this en una búsqueda rápida, pero no puedo dar sentido a esa respuesta:

+0

esto proporciona una buena respuesta resumida http://stackoverflow.com/a/2772888/1358837 – Mathee

+2

Ningún conferencista debe contentarse con dar tal respuesta, y usted tampoco debería contestar. – EJP

+0

Esto se ha pedido muchas veces. http://stackoverflow.com/questions/971954/difference-between-equals-and – Kezzer

Respuesta

110

En Java, == siempre solo compara dos referencias (para los no primitivas, que es) - es decir, se comprueba si los dos los operandos se refieren al mismo objeto.

Sin embargo, el método equals se puede anular, por lo que dos objetos distintos pueden ser iguales.

Por ejemplo:

String x = "hello"; 
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' }); 

System.out.println(x == y); // false 
System.out.println(x.equals(y)); // true 

Además, vale la pena ser consciente de que cualquiera de los dos iguales constantes de cadena (principalmente cadenas literales, sino también combinaciones de las constantes de cadena a través de la concatenación) va a terminar haciendo referencia a la misma cadena . Por ejemplo:

String x = "hello"; 
String y = "he" + "llo"; 
System.out.println(x == y); // true! 

Aquí x y y son referencias a la misma cadena, porque y es una constante de tiempo de compilación igual a "hello".

+1

¿Qué pasa con las clases no genéricas, donde los iguales no se anularon. ¿el método igual será el mismo que "==" y simplemente verifica si las dos instancias de la clase se refieren al mismo objeto? Gracias. – Numerator

+3

@Nir: Sí. En las clases, a menos que anule Equals, siempre significará igualdad de referencia. –

+0

redacción horrible aquí. El '==' comprueba si dos objetos apuntan a la misma ubicación de memoria, es decir, son punteros al objeto uno en el mismo. El método 'igual()' compara el estado del objeto, es decir, dado el mismo tipo, todos los elementos internos, como las variables de instancia, son iguales. – ingyhere

19

El operador == compara si los objetos son los mismos instancia. El orador de iguales() compara el estado de los objetos (por ejemplo, si todos los atributos son iguales). Incluso puede anular el método equals() para definirse a usted mismo cuando un objeto es igual a otro.

+7

Tenga en cuenta que la implementación predeterminada de 'equals()' en 'Object' vuelve a 'this == other' de manera efectiva. Esa es una fuente común de confusión, ya que no verá una diferencia a menos que esté utilizando una clase que realmente implemente 'equals()' de una manera significativa. –

+1

Derecha, debería haber mencionado eso. El interlocutor puede mirar el JDK en sí mismo, hay numerosas clases que puede tomar como ejemplo. – Sylar

15

Si usted y yo cada uno entra en el banco, cada uno abre una cuenta nueva marca, y cada depósito de $ 100, entonces ...

  1. myAccount.equals(yourAccount) es true porque tienen el mismo valor , pero
  2. myAccount == yourAccount es false porque no son la misma cuenta .

(Suponiendo definiciones apropiadas de la clase Account, por supuesto. ;-)

+3

Eso sería una muy mala implementación de iguales. – user44242

+4

También fue una explicación muy, muy mala de la diferencia entre == y equals. – jarnbjo

+1

Me gusta esta comparación jaja, muestra por qué no debe codificar '==' para cadenas ya que la persona equivocada puede obtener su dinero o no puede obtener su dinero en absoluto. (¿Quién iba a almacenar dinero como una cadena de todos modos LOL) pero es un buen ejemplo para asustar a los programadores. – SSpoke

2

== es un operador. equals es un método definido en la clase de objeto

== comprueba si dos objetos tienen la misma dirección en la memoria y para la primitiva comprueba si tienen el mismo valor. El método de igualdad, por otra parte, comprueba si los dos objetos que se están comparando tienen un valor igual (dependiendo de cómo, por supuesto, se ha implementado el método equals para los objetos).El método igual no se puede aplicar en primitivas (lo que significa que si a es una primitiva a.equals (someobject) no está permitido, sin embargo se permite someobject.equals (a)).

-2

El método equals() y el operador == realizan dos operaciones diferentes. El método equals() compara los caracteres dentro de un objeto String. El operador == compara dos referencias de objetos para ver si se refieren a la misma instancia. El programa siguiente muestra cómo dos objetos String diferentes pueden contener los mismos caracteres, pero las referencias a estos objetos no se compara como igual:

// equals() vs == 
class EqualsNotEqualTo { 
    public static void main(String args[]) { 
      String s1 = "Hello"; 
      String s2 = new String(s1); 
      System.out.println(s1 + " equals " + s2 + " -> " + 
      s1.equals(s2)); 
      System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2)); 
    } 
} 

La variable s1 se refiere a la instancia String creado por “Hello”. El objeto al que se hace referencia en s2 se crea con s1 como inicializador. Por lo tanto, el contenido de los dos objetos String es idéntico, pero son objetos distintos. Esto significa que s1 y s2 no se refieren a los mismos objetos y son, por lo tanto, no ==, como se muestra aquí por la salida del ejemplo precedente:

Hello equals Hello -> true 
Hello == Hello -> false 
+1

La pregunta en realidad no se refería a cadenas. Si bien el método de igualdad a menudo se refiere al "interior" de un objeto, no está obligado a hacerlo. Muchos objetos del método .equals() solo usan la dirección de la memoria (es decir, son equivalentes a ==) –

+1

En Java, hay un pequeño número de tipos primitivos y * un * tipo de "referencia". El operador '==' prueba si sus operandos son el * mismo *. Como el "valor" de un tipo de referencia es la * identidad * de un objeto, los operandos solo se consideran iguales si se refieren al mismo objeto. Nada sobre el objeto en sí importa; de hecho, la comparación se realiza sin siquiera mirarlo. – supercat

-1

En Java, cuando el “== El operador "" se usa para comparar 2 objetos, comprueba si los objetos se refieren al mismo lugar en la memoria. EX:

String obj1 = new String("xyz"); 
String obj2 = new String("xyz"); 
if(obj1 == obj2) 
    System.out.println("obj1==obj2 is TRUE"); 
else 
    System.out.println("obj1==obj2 is FALSE"); 

A pesar de que las cadenas tienen los mismos caracteres exactos (“XYZ”), El código anterior realidad de salida: obj1 == obj2 es FALSO

clase

String de Java en realidad anula el valor predeterminado equals() implementación en la clase Object - y anula el método para que solo compruebe los valores de las cadenas, no sus ubicaciones en la memoria. Esto significa que si llama al método equals() para comparar 2 objetos String, entonces, siempre que la secuencia real de caracteres sea igual, ambos objetos se consideran iguales.

String obj1 = new String("xyz"); 
String obj2 = new String("xyz"); 
if(obj1.equals(obj2)) 
    System.out.printlln("obj1==obj2 is TRUE"); 
else 
    System.out.println("obj1==obj2 is FALSE"); 

Este código es la salida los siguientes:

obj1 == obj2 es TRUE

+0

Normalmente comprobará si los objetos residen en el mismo lugar en la memoria, pero eso es un detalle de implementación. Sería posible que un recolector de basura simultáneo establezca una trampa de escritura en la ubicación actual de un objeto, copie el objeto en una nueva ubicación, luego actualice una referencia para hacer referencia a la nueva copia y finalmente actualice la otra referencia. El operador '==' tendría que devolver 'true' en todo momento, incluso entre las dos actualizaciones, ya que ambas referencias * identificarían * el mismo objeto, pero eso no implicaría que identificaran la misma pieza de memoria. – supercat

-2

permite decir que "==" devuelve true si ambos operandos ambos pertenecen al mismo objeto, pero cuando se va return true ya que no podemos asignar un único objeto de múltiples valores

public static void main(String [] args){ 
    String s1 = "Hello"; 
    String s1 = "Hello"; // This is not possible to assign multiple values to single object 
    if(s1 == s1){ 
     // Now this retruns true 
    } 
} 

Ahora, cuando esto sucede, prácticamente hablando, si su no sucede entonces por qué esto es == compara funcionalidad ....

-1
public static void main(String[] args){ 
     String s1 = new String("hello"); 
     String s2 = new String("hello"); 

     System.out.println(s1.equals(s2)); 
     //// 
     System.out.println(s1 == s2); 

    System.out.println("-----------------------------"); 

     String s3 = "hello"; 
     String s4 = "hello"; 

     System.out.println(s3.equals(s4)); 
     //// 
     System.out.println(s3 == s4); 
    } 

Aquí en este código u puede campare los dos '==' y'.equals

aquí .equals se utiliza para comparar los objetos de referencia y '==' se utiliza para comparar el estado de objetos ..

+0

Tienes eso exactamente al revés. – EJP

-1

(1) == se puede aplicar tanto para primitivos como para tipos de objetos, pero el método equals() solo se puede aplicar para tipos de objetos.

(2) == no puede anularse para la comparación de contenido, pero el método equals se puede anular para la comparación de contenido (por ejemplo, clase String, clases contenedoras, clases de colección).

(3) == da error de tipo incomparable cuando intentas aplicar para tipos heterogéneos, donde el método igual devuelve falso.

0

== operador compara dos referencias de objeto para comprobar si se refieren a la misma instancia. Esto también, devolverá verdadero en exitoso ejemplo match.for

public class Example{ 
public static void main(String[] args){ 
String s1 = "Java"; 
String s2 = "Java"; 
String s3 = new string ("Java"); 
test(Sl == s2)  //true 
test(s1 == s3)  //false 
}} 

ejemplo anterior == es una comparación de referencia es decir, ambos objetos apuntan a la misma posición de memoria

cadena es igual a() es evalúa a la comparación de valores en los objetos.

public class EqualsExample1{ 
    public static void main(String args[]){ 
    String s = "Hell"; 
    String s1 =new string("Hello"); 
    String s2 =new string("Hello"); 
    s1.equals(s2); //true 
    s.equals(s1) ; //false 
    }} 

anterior ejemplo Se compara el contenido de las cadenas. Devolverá verdadero si la cadena coincide, de lo contrario devuelve falso.

-2

Aquí es una simple interpretación acerca de su problema:

== (igual a) que se utiliza para evaluar la expresión aritmética

donde como

iguales() método utilizado para comparar la cadena

Therefo es mejor utilizar == para operaciones numéricas & método equals() para operaciones relacionadas con Cadenas. Entonces, para la comparación de objetos, el método equals() sería la elección correcta.

+1

Nada sobre String en la pregunta. – EJP

+1

@EJP Acabo de tratar de interpretar el significado del método == & equals(). – ersks

Cuestiones relacionadas