2009-11-07 5 views
27

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?

+0

Przeczytałem "oops" jako panikę jądra lub język programowania, o którym nigdy nie słyszałem. –

+0

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

+0

Edytowałem tekst pytania, aby objaśnić skrót dla korzyści osób powyżej. –

Odpowiedz

46
  • 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.

+0

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

+8

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. –

5

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.

13

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 ;-)

+0

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

+2

ciągi są czasami internowane, na przykład, gdy są to czasy kompilacji. –

1

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.

0

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 
0

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

http://ocw.mit.edu/NR/rdonlyres/Electrical-Engineering-and-Computer-Science/6-170Fall-2005/D659DC53-FB1D-403C-8E35-2CAECBED266E/0/lec12.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

1

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.
0

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).

2

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.

3

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.

Powiązane problemy