2009-11-07 17 views
27

Was ist der Unterschied zwischen Identität und Gleichheit in OOP (Object Oriented Programming)?Was ist der Unterschied zwischen Identität und Gleichheit in OOP?

+0

Ich las "oops" als eine Kernel-Panik oder eine Programmiersprache, von der ich noch nie gehört habe. –

+0

Ich las das als Schleifen und fragte mich eine Minute lang, wann ich in eine Situation geraten würde, in der Identität gegen Gleichheit eine Rolle spielte. – Esko

+0

Ich habe den Fragetext bearbeitet, um das Akronym für den Nutzen der oben genannten zu erklären. –

Antwort

46
  • Identität: eine Variable hält die gleiche Instanz wie eine andere Variable.

  • Gleichheit: zwei verschiedene Objekte können austauschbar verwendet werden. sie haben oft haben die gleiche ID.

Zum Beispiel:

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

a ist identisch mit b.

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

c gleich aber nicht identisch mit d.

Natürlich sind zwei identische Variablen immer gleich.

In Java ist die Gleichheit definiert durch die equals Methode. Denken Sie daran, wenn Sie equals implementieren, müssen Sie auch hashCode implementieren.

+0

Eigentlich wegen Integer-Pooling in Java 1.5+, in Ihrem Beispiel a == b, also sind sie identisch! Probieren Sie es mit einer JVM von 1,5 oder höher aus! – MetroidFan2002

+8

das ist falsch metroid. Wie in einer anderen Antwort von mir angemerkt, kann die Kompilierung keine Tricks machen, wenn Objekte mit einem "neuen" Operator zugewiesen werden. Nur wenn Sie sie mit Integer.valueof (1) erstellen, werden die Objekte gepoolt. –

5

Identität bedeutet, dass es sich um die gleiche Objektinstanz handelt, während Gleichheit bedeutet, dass die Objekte, die Sie vergleichen, mit verschiedenen Instanzen eines Objekts übereinstimmen, aber dieselben Daten enthalten.

Illustration (in Java)

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

So a und b sind verschiedene Instanzen (unterschiedliche Zuordnungen im Speicher), sondern auf den "Daten" -Niveau sie gleich sind.

13

Identität bestimmt, ob zwei Objekte die gleiche Speicheradresse haben. Gleichheit bestimmt, ob zwei Objekte den gleichen Status enthalten.

Wenn zwei Objekte identisch sind, dann sind sie auch gleich, aber nur weil zwei Objekte gleich sind, bedeutet dies nicht, dass sie die gleiche Speicheradresse teilen.

Es gibt einen Sonderfall für Streicher, aber die Off-Topic ist und Sie jemanden fragen müssen, sonst darüber, wie das genau funktioniert ;-)

+0

Gibt es einen speziellen Fall für Strings in Java? Ich dachte, das war nur in .NET – finnw

+2

Zeichenketten sind manchmal interniert, zum Beispiel, wenn sie Kompilierzeitkonstanten sind. –

1

In Java und ähnlichen Sprachen, die ‚Leck‘ die Abstraktion eines Referenz eines Objekts, können Sie testen, ob sich zwei Referenzen auf das gleiche Objekt beziehen. Wenn sie sich auf dasselbe Objekt beziehen, sind die Referenzen identisch. In Java ist dies der Operator ==.

Es gibt auch eine equals Methode, die verwendet wird, um zu testen, ob zwei Objekte den gleichen Wert haben, zum Beispiel als Schlüssel eines HashSet (der Hash-Code von gleichen Objekten sollte auch gleich sein). Gleichwertige Objekte sollten denselben Wert und dieselbe Semantik aufweisen, wenn sie vom Clientcode verwendet werden.

Reiner objektorientierte Sprachen haben keinen Identitätsvergleich, da es dem Client-Code generell egal ist, ob zwei Objekte die gleiche Speicheradresse haben oder nicht.Wenn Objekte die gleiche reale Entität darstellen, wird diese besser mit einer ID oder einem Schlüsselwert als mit der Identität modelliert, die dann Teil des Gleichheitsvertrags wird. Sich nicht auf die Speicheradresse des Objekts zu verlassen, um eine echte Identität darzustellen, vereinfacht Caching und verteiltes Verhalten und das Unterdrücken von == würde eine Menge von Fehlern im Zeichenfolgenvergleich oder einige Anwendungen des Boxens von Grundelementen in Java entfernen.

0

x == y ist nur wahr, wenn dasselbe Objekt von den Variablen x und y referenziert wird.

x.equals(y) hängt von der Implementierung x.equals(), und ist in der Regel weniger streng, dass das oben, wie es den Inhalt des Objekts vergleicht. (In Java, wenn x.equals(y), muss es auch sein, dass x.hashCode() == y.hashCode();)

Beispiel:

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 ...)
== und = ist Gleichheitstest

and for Objects
== und! = ist Identitätstest. [Vergleicht nur die Referenz]

equals Verfahren zur Gleichheitstest von Objekten verwendet wird [es kann bestimmte Attribute zu vergleichen, außer Kraft gesetzt werden]

i einen ausgezeichneten Artikel auf dieser http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L14-Comparison/L14cs211sp06.pdf

gefunden

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

Zitieren
Ich mag Schweine. Hunde blicken zu uns auf. Katzen schauen auf uns herab. Schweine behandeln uns auf Augenhöhe.: D
Sir Winston Churchill

1

Identität: Zwei Referenzen auf das gleiche Objekt (o1 == o2).

Gleichheit: Die Methode o1.equals(o2) gibt true zurück. Dies bedeutet nicht notwendigerweise, dass die zwei Objekte (alle) dieselben Daten enthalten.

Theoretisch ist es möglich, eine Methode equals() zu überschreiben, um false sogar für identische Objekte zurückzugeben. Dies würde aber bricht die Spezifikation von Object.equals():

Die Gleichheits Verfahren implementiert eine Äquivalenzrelation auf Nicht-Null-Objekt-Referenzen:

  • Es ist reflexiv: für jeden Nicht-Null-Referenzwert x, x. equals (x) sollte true zurückgeben.
  • Es ist symmetrisch: Für alle Nicht-Null-Referenzwerte x und y sollte x.equals (y) genau dann true zurückgeben, wenn y.equals (x) true zurückgibt.
  • Es ist transitiv: für alle Nicht-Null-Referenzwerte x, y und z, wenn x.equals (y) true zurückgibt und y.equals (z) true zurückgibt, sollte x.equals (z) true zurückgeben .
  • Es ist konsistent: für alle Nicht-Null-Referenzwerte x und y liefern mehrere Aufrufe von x.equals (y) konsistent true oder konsistent return false, vorausgesetzt, dass keine Informationen in equals-Vergleichen für die Objekte geändert werden.
  • Für jeden Nicht-Null-Referenzwert x sollte x.equals (null) false zurückgeben.
0

Identität Konzept ist sehr philosophisch, das ist, warum Sie es nicht nur zu den Referenzen reconduce sollten.

Sie können sagen, dass zwei Identitäten gleich sind, wenn eine Änderung an der ersten sich auf der zweiten widerspiegelt und umgekehrt. Natürlich beinhaltet dies auch das Teilen der gleichen Speicheradresse, aber im Allgemeinen, während die Identität mit den Attributen des Objekts in Beziehung steht, wird die Gleichheit verwendet, um zu überprüfen, wann immer zwei Objekte identisch sind, aber dies schließt die Identität nicht ein.

Das Umgekehrte ist ziemlich offensichtlich, wenn zwei Elemente die gleiche Identität haben, sind sie auch gleich (in Gleichheit ausgedrückt austauschbar).

2

Denken Sie über die Wörter "identisch" und "gleichwertig" nach. Wenn zwei Dinge identisch sind, haben sie die gleiche Identität; Sie sind das Gleiche. Wenn sie gleichwertig sind, kann man das andere ersetzen, ohne das Ergebnis zu beeinflussen; Sie haben das gleiche Verhalten und die gleichen Eigenschaften.

3

Zum Beispiel

In Stackoverflow:

  • Identität: Ich bin Michael, bist du sevugarajan, so sind wir nicht gleich.

  • Gleichheit: wenn wir den gleichen Ruf Scores haben, sind wir in gewisser Weise gleich.

Verwandte Themen