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?
Antwort
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.
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
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. –
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.
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 ;-)
Gibt es einen speziellen Fall für Strings in Java? Ich dachte, das war nur in .NET – finnw
Zeichenketten sind manchmal interniert, zum Beispiel, wenn sie Kompilierzeitkonstanten sind. –
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.
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
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
gefundenZitieren
Ich mag Schweine. Hunde blicken zu uns auf. Katzen schauen auf uns herab. Schweine behandeln uns auf Augenhöhe.: D
Sir Winston Churchill
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.
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).
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.
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.
- 1. Was ist der Unterschied zwischen Äquivalenz und Gleichheit?
- 2. Was ist der Unterschied zwischen Geom und Statistik in ggplot2?
- 3. Was ist der Unterschied zwischen `==` und `ist`?
- 4. Was ist der Unterschied zwischen IComparable und IEquatable-Schnittstellen?
- 5. Was ist der Unterschied zwischen/* ... */und/** ... */
- 6. Was ist der Unterschied zwischen + = und = +?
- 7. Was ist der Unterschied zwischen $ (()) und Ausdruck?
- 8. Was ist der Unterschied zwischen:.! und: r !?
- 9. Was ist der Unterschied zwischen Verilog! und ~?
- 10. Was ist der Unterschied zwischen Difftime und '-'?
- 11. Was ist der Unterschied zwischen $ und $$?
- 12. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 13. Was ist der Unterschied zwischen `&` und `ref`?
- 14. Was ist der Unterschied zwischen $ (...) und `...`
- 15. Was ist der Unterschied zwischen .Equals und ==
- 16. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 17. Was ist der Unterschied zwischen? und ? = Nil
- 18. Was ist der Unterschied zwischen `super (...)` und `return super (...)`?
- 19. Was ist der Unterschied zwischen:
- 20. ASP.Net Identität: Unterschied zwischen UseOAuthBearerTokens und UseCookieAuthentication?
- 21. Was ist der Unterschied zwischen scipy.ndimage.filters.convolve und scipy.signal.convolve?
- 22. Was ist der Unterschied zwischen einem Algorithmus und einem Entwurfsmuster
- 23. Was ist der Unterschied zwischen: und :: und ::: in Javascript Grammatik
- 24. Was ist der Unterschied zwischen add und [] in der Wörterbuchoperation
- 25. Was ist der Unterschied zwischen `-Contains` und` -In` in PowerShell?
- 26. Was ist der Unterschied zwischen der JSP und der JSTL?
- 27. Was ist der Unterschied zwischen ist - (void) und + (void) Methoden
- 28. Was ist der Unterschied zwischen PS1 und PROMPT_COMMAND ist
- 29. Was ist der Unterschied zwischen Task.Run ist() und Task.Factory.StartNew()
- 30. Was ist der Unterschied zwischen NetFx45WebLink und NetFx45RedistLink ist
Ich las "oops" als eine Kernel-Panik oder eine Programmiersprache, von der ich noch nie gehört habe. –
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
Ich habe den Fragetext bearbeitet, um das Akronym für den Nutzen der oben genannten zu erklären. –