2009-11-07 26 views
27

¿Cuál es la diferencia entre identidad e igualdad en OOP (programación orientada a objetos)?¿Cuál es la diferencia entre identidad e igualdad en OOP?

+0

He leído "oops" como un kernel panic o un lenguaje de programación del que nunca he oído hablar. –

+0

Lo leí como bucles y me pregunté por un minuto cuándo me encontraría en una situación en la que la identidad frente a la igualdad importaba. – Esko

+0

He editado el texto de la pregunta para explicar el acrónimo en beneficio de los anteriores. –

Respuesta

46
  • identidad: una variable tiene el mismo ejemplo, como otra variable.

  • igualdad: dos distinto objetos pueden se pueden utilizar indistintamente. a menudo tienen la misma identificación.

Por ejemplo:

Integer a = new Integer(1); 
Integer b = a; 

a es idéntica a b.

Integer c = new Integer(1); 
Integer d = new Integer(1); 

c es igual pero no idéntica a d.

Por supuesto, dos variables idénticas siempre son iguales.

En Java, la igualdad se define mediante el método equals. Tenga en cuenta que si implementa equals, también debe implementar hashCode.

+0

En realidad, debido a la agrupación de enteros en Java 1.5+, en su ejemplo, a == b, ¡entonces son idénticos! Pruébelo en una JVM de 1.5 o superior. – MetroidFan2002

+8

esto es incorrecto metroid. como noté en una respuesta diferente de mí, la compilación no puede hacer trucos cuando se asignan objetos con el "nuevo" operador. solo si los crea con Integer.valueof (1) los objetos se agruparán. –

5

Identidad significa que es la misma instancia de objeto, mientras que igualdad significa que los objetos que compara son diferentes instancias de un objeto pero que contienen los mismos datos.

Ilustración (en Java)

Date a = new Date(123); 
Date b = new Date(123); 
System.out.println(a==b); //false 
System.out.println(a.equals(b)); //true 

Así a y b son diferentes instancias (diferentes asignaciones en la memoria), pero en el nivel "datos" son iguales.

13

La identidad determina si dos objetos comparten la misma dirección de memoria. La igualdad determina si dos objetos contienen el mismo estado.

Si dos objetos son idénticos, también son iguales, pero el hecho de que dos objetos sean iguales no significa que compartan la misma dirección de memoria.

Hay un caso especial para cuerdas, sino que es fuera de tema y usted tendrá que pedir a otra persona acerca de cómo funciona exactamente ;-)

+0

¿Hay algún caso especial para Strings en Java? Pensé que solo estaba en .NET – finnw

+2

las cadenas a veces se internan, por ejemplo, cuando son constantes de tiempo de compilación. –

1

En Java y lenguajes similares que 'fuga' de la abstracción de una referencia de un objeto, puede probar si dos referencias se refieren al mismo objeto. Si se refieren al mismo objeto, entonces las referencias son idénticas. En Java, este es el operador ==.

También hay un método equals que se utiliza para probar si dos objetos tienen el mismo valor, por ejemplo cuando se utiliza como teclas de un HashSet (el código hash de objetos iguales también debe ser igual). Los objetos iguales deben tener el mismo "valor" y semántica cuando los usa el código del cliente.

Los lenguajes orientados a objetos más puros no tienen una comparación de identidad, ya que al código de cliente en general no debería importarle si dos objetos tienen o no la misma dirección de memoria.Si los objetos representan la misma entidad del mundo real, entonces se modela mejor usando algún ID o valor clave en lugar de identidad, que luego se convierte en parte del contrato igual. No confiar en la dirección de memoria del objeto para representar la identidad del mundo real simplifica el almacenamiento en caché y el comportamiento distribuido, y suprimir == eliminaría un host de errores en la comparación de cadenas o algunos usos del boxeo de primitivas en Java.

0

x == y es verdadero solo si existe el mismo objeto al que hacen referencia las variables x y y.

x.equals(y) depende de la implementación de x.equals(), y suele ser menos estricto que el anterior, ya que compara el contenido del objeto. (En Java, si x.equals(y), sino que también debe ser cierto que x.hashCode() == y.hashCode();)

Ejemplo:

Integer w = new Integer(3); 
Integer x = new Integer(1); 
Integer y = x; 
Integer z = new Integer(1); 

// all of these evaluate to true 
y.equals(x) // it's the same object, of course the content is same 
x.equals(z) // different objects, same content (`1`) 
z.equals(y) 
!w.equals(x); // the content is different (`3` vs `1`) 
!w.equals(y); 
!w.equals(z); 
x == y // same object 
z != x // different objects 
y != z 
w != x 
0

For primitive types (int , boolean , char, long , float ...)
== y = es prueba de igualdad

and for Objects
== y! = es la prueba de identidad. [Se compara únicamente la referencia]

equals método se utiliza para la prueba de igualdad de objetos [que se puede anular a comparar los atributos específicos]

he encontrado un excelente artículo sobre este http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L14-Comparison/L14cs211sp06.pdf

http://ocw.mit.edu/NR/rdonlyres/Electrical-Engineering-and-Computer-Science/6-170Fall-2005/D659DC53-FB1D-403C-8E35-2CAECBED266E/0/lec12.pdf

Cita
Me gustan los cerdos. Los perros nos admiran. Los gatos nos miran con desprecio. Los cerdos nos tratan como iguales.: D
Sir Winston Churchill

1

Identidad: Dos referencias al mismo objeto (o1 == o2).

Igualdad: El método o1.equals(o2) devuelve true. Esto no significa necesariamente que los dos objetos contengan (todos) los mismos datos.

En teoría, es posible anular un método equals() para devolver false, incluso para objetos idénticos. Pero esto rompería la especificación de Object.equals():

El método equals implementa una relación de equivalencia en las referencias a objetos no nulos:

  • Es reflexiva: para cualquier valor de referencia no nulo x, x. equals (x) debería devolver verdadero.
  • Es simétrico: para cualquier valor de referencia no nulo x e y, x.equals (y) debería devolver verdadero si y solo si y.equals (x) devuelve verdadero.
  • Es transitivo: para cualquier valor de referencia no nulo x, y y z, si x.equals (y) devuelve verdadero y y.equals (z) devuelve verdadero, entonces x.equals (z) debe devolver verdadero .
  • Es coherente: para cualquier valor de referencia no nulo xey, las invocaciones múltiples de x.equals (y) devuelven true o devuelven false de manera consistente siempre que no se modifique la información utilizada en comparaciones iguales en los objetos.
  • Para cualquier valor de referencia no nulo x, x.equals (nulo) debe devolver falso.
0

concepto de identidad es bastante filosóficas, es por eso que no debes reconduce la pena sólo por referencias.

Puede decir que dos identidades son iguales si se refleja un cambio en el primero en el segundo y viceversa. Por supuesto, esto también incluye compartir la misma dirección de memoria pero, en general, mientras que la identidad está relacionada con los atributos del objeto, la igualdad se usa para verificar siempre que dos objetos sean idénticos, pero esto no incluye la identidad.

El viceversa es bastante obvio, si dos elementos tienen la misma identidad, también son iguales (en términos de igualdad de ser intercambiables).

2

Piense en las palabras "idéntico" y "equivalente". Si dos cosas son idénticas, tienen la misma identidad; son lo mismo Si son equivalentes, uno puede ser sustituido por el otro sin afectar el resultado; ellos tienen el mismo comportamiento y propiedades.

3

Por ejemplo,

En StackOverflow:

  • identidad: soy Michael, eres sevugarajan, por lo que no son los mismos.

  • igualdad: si tenemos la misma reputación puntos, somos iguales en algunos aspectos.

Cuestiones relacionadas