Jaka jest różnica między tożsamością a równością w OOP (Object Oriented Programming)?Jaka jest różnica między tożsamością a równością w OOP?
Odpowiedz
tożsamość: zmienna posiada samą Instancji innej zmiennej.
równości: dwa różne przedmioty mogą być stosowane zamiennie. często mają ten sam identyfikator.
Na przykład
Integer a = new Integer(1);
Integer b = a;
a
jest identyczna b
.
Integer c = new Integer(1);
Integer d = new Integer(1);
c
jest równa, ale nie identyczne d
.
Oczywiście dwie identyczne zmienne są zawsze równe.
W języku Java równość jest definiowana za pomocą metody equals
. Pamiętaj, że jeśli zaimplementujesz equals, musisz również zaimplementować hashCode.
Właściwie ze względu na łączenie Integer w Javie 1.5+, w twoim przykładzie, a == b, więc są one identyczne! Wypróbuj go na maszynie wirtualnej JVM 1,5 lub wyższej! – MetroidFan2002
to jest niewłaściwy metroid. jak zauważono w innej odpowiedzi przeze mnie, kompilacja może nie zrobi sztuczek przy przydzielaniu obiektów z "nowym" operatorem. tylko jeśli utworzysz je z Integer.valueof (1), obiekty zostaną połączone. –
Tożsamość oznacza, że jest to ta sama instancja obiektu, podczas gdy równość oznacza porównywane obiekty do różnych instancji obiektu, ale które zawierają te same dane.
Ilustracja (w Javie)
Date a = new Date(123);
Date b = new Date(123);
System.out.println(a==b); //false
System.out.println(a.equals(b)); //true
Więc aib są różne przypadki (różne przydziały w pamięci), ale na poziomie „dane” są równe.
Tożsamość określa, czy dwa obiekty mają ten sam adres pamięci. Równość określa, czy dwa obiekty zawierają ten sam stan.
Jeśli dwa obiekty są identyczne, to są równe, ale tylko dlatego, że dwa obiekty są równe, nie oznaczają, że mają ten sam adres pamięci.
Jest to szczególny przypadek na smyczki, ale to nie na temat i musisz poprosić kogoś innego o tym, jak to działa dokładnie ;-)
Czy istnieje specjalny przypadek dla ciągów znaków w języku Java? Myślałem, że to jest właśnie w .NET – finnw
ciągi są czasami internowane, na przykład, gdy są to czasy kompilacji. –
w Javie i podobnych języków, które „przeciek” abstrakcję Odwołanie do obiektu można sprawdzić, czy dwa odwołania odnoszą się do tego samego obiektu. Jeśli odnoszą się do tego samego obiektu, odniesienia są identyczne. W języku Java jest to operator ==
.
Istnieje również metoda equals
, która służy do sprawdzenia, czy dwa obiekty mają tę samą wartość, na przykład gdy są używane jako klucze HashSet
(kod skrótu równych obiektów również powinien być równy). Obiekty równe powinny mieć tę samą "wartość" i semantykę, gdy są używane przez kod klienta.
Czyste języki obiektowe nie mają porównania tożsamości, ponieważ kod klienta na ogół nie powinien przejmować się tym, czy dwa obiekty mają ten sam adres pamięci.Jeśli obiekty reprezentują tę samą rzeczywistą jednostkę, to lepiej jest modelowane przy użyciu jakiegoś identyfikatora lub wartości klucza niż tożsamości, która staje się częścią równego kontraktu. Nie poleganie na adresie pamięci obiektu w celu reprezentowania rzeczywistej tożsamości upraszcza buforowanie i zachowanie rozproszone, a tłumienie ==
usunie wiele błędów w porównywaniu ciągów lub niektórych zastosowaniach boksu prymitywów w Javie.
x == y
jest prawdziwe tylko wtedy, gdy istnieje ten sam obiekt, do którego odnoszą się zmienne x
i y
.
zależy od implementacji x.equals()
i jest zwykle mniej ścisłe niż powyższe, ponieważ porównuje zawartość obiektu. (W języku Java, jeśli x.equals(y)
, to musi być również prawdą, że x.hashCode() == y.hashCode();
)
Przykład:
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 ...)
== a = Test jest równość
and for Objects
== i! = jest testem tożsamości. [Porównuje tylko odniesienia]
equals
sposób jest stosowany do badania równości obiektów [można przestawić porównanie specyficzne cechy]
i znaleźć doskonałe artykuł tego http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L14-Comparison/L14cs211sp06.pdf
Cytat
Lubię świnie. Psy patrzą na nas. Koty patrzą na nas z góry. Świnie traktują nas jak równych sobie.: D
Sir Winston Churchill
Tożsamość: Dwa odniesienia do tego samego obiektu (o1 == o2
).
Równość: Metoda o1.equals(o2)
zwraca true
. Nie musi to oznaczać, że oba obiekty zawierają (wszystkie) te same dane.
Teoretycznie można zastąpić metodę equals()
, aby zwrócić false
nawet dla identycznych obiektów. Ale złamać specyfikację Object.equals()
:
równości sposób realizuje stosunek równoważności na nie-zerowych odwołań do obiektów:
- jest zwrotna: dla każdego nie-zerowej wartości odniesienia x, x. equals (x) powinien zwracać wartość true.
- Jest symetryczny: dla dowolnych niezerowych wartości odniesienia x i y, x.equals (y) powinno zwracać wartość true wtedy i tylko wtedy, gdy y.equals (x) zwraca true.
- Jest przechodnia: dla dowolnych niezerowych wartości odniesienia x, y i z, jeśli x.equals (y) zwraca wartość true, a y.equals (z) zwraca wartość true, to x.equals (z) powinno zwracać wartość true .
- Jest spójny: dla dowolnych niezerowych wartości odniesienia xiy, wielokrotne wywołania x.equals (y) konsekwentnie zwracają true lub konsekwentnie zwracają false, pod warunkiem, że nie zmodyfikowano żadnej informacji użytej do porównywania obiektów.
- Dla każdej niezerowej wartości odniesienia x, x.equals (null) powinno zwrócić wartość false.
Identity koncepcja jest dość filozoficzna, dlatego nie powinno się go po prostu do reconduce odniesień.
Można powiedzieć, że dwie tożsamości są takie same, jeśli zmiana na pierwszą jest odzwierciedlona na drugiej i na odwrót. Oczywiście obejmuje to również współużytkowanie tego samego adresu pamięci, ale generalnie podczas gdy tożsamość jest związana z atrybutami obiektu, równość jest używana do sprawdzania, gdy dwa obiekty są identyczne, ale nie obejmuje to tożsamości.
Wiceversa jest dość oczywista, jeśli dwa elementy mają tę samą tożsamość, są równe (w równości są wymienialne).
Pomyśl o słowach "identyczny" i "równoważny". Jeśli dwie rzeczy są identyczne, mają tę samą tożsamość; są to te same rzeczy. Jeśli są one równoważne, można zastąpić drugą bez wpływu na wynik; mają takie samo zachowanie i właściwości.
Na przykład
W StackOverflow:
tożsamość: Jestem Michael, jesteś sevugarajan, więc nie są takie same.
równość: jeśli mamy tę samą ocenę wyników, jesteśmy równi pod pewnymi względami.
- 1. Jaka jest różnica między UIViewController a UITableViewController
- 2. Jaka jest różnica między == a === w Verilog?
- 3. Jaka jest różnica między $ a a $$ a w php?
- 4. Jaka jest różnica między Ember.computed.alias a Ember.binding?
- 5. Jaka jest różnica między pakietem a intencją?
- 6. Jaka jest różnica między krotką a kompresją?
- 7. Jaka jest różnica między uchwytem a wątkiem?
- 8. Jaka jest różnica między cancelBubble a stopPropagation?
- 9. Jaka jest różnica między HAVING a WHERE?
- 10. Jaka jest różnica między użytkownikiem a rolą?
- 11. Jaka jest różnica między StudlyCaps a CamelCase?
- 12. Jaka jest różnica między Const a Constant?
- 13. Jaka jest różnica między @Inject a @PersistenceContext?
- 14. Jaka jest różnica między preferredLocalization a preferredLanguage?
- 15. Jaka jest różnica między JavaBean a POJO?
- 16. Jaka jest różnica między podprocesiem.popen a podprocesią.run?
- 17. Jaka jest różnica między funkcjami a zamknięciami?
- 18. Jaka jest różnica między ramką a ramką?
- 19. Jaka jest różnica między hashowaniem a indeksowaniem?
- 20. Jaka jest różnica między przyszłym a shared_future?
- 21. Jaka jest różnica między tasklet a workqueue
- 22. Jaka jest różnica między Listą a ArrayList?
- 23. Jaka jest różnica między PermGenem a Metaspace?
- 24. Jaka jest różnica między Dispatcher.BeginInvoke a Task.Factory.StartNew
- 25. Jaka jest różnica między SUMĄ a SUBTOTALEM?
- 26. jaka jest różnica między CONTENT_FILTER_URI a CONTENT_URI?
- 27. Jaka jest różnica między process.cwd() a __dirname?
- 28. Jaka jest różnica między ItemTemplate a ItemPanelTemplate?
- 29. Jaka jest różnica między spark.sql.shuffle.partitions a spark.default.parallelism?
- 30. Jaka jest różnica między spin_lock a raw_spin_lock()?
Przeczytałem "oops" jako panikę jądra lub język programowania, o którym nigdy nie słyszałem. –
Czytałem to jako pętle i zastanawiałem się przez chwilę, kiedy trafiłbym w sytuację, w której liczy się tożsamość kontra równość. – Esko
Edytowałem tekst pytania, aby objaśnić skrót dla korzyści osób powyżej. –