2010-01-06 7 views

Odpowiedz

27

equals Sposób StringBuffer nie nadpisany Object, więc właśnie odniesienie równe, to znaczy takie same, jak przy użyciu ==. Podejrzewam, że powodem jest to, że StringBuffer jest modyfikowalny, a nadpisanie equals jest w większości użyteczne dla klas podobnych do wartości, które możesz chcieć użyć jako kluczy (chociaż listy mają również nadpisane equals i StringBuffer to rodzaj listy, więc to jest nieco niespójne).

18

Porównujesz odwołania do obiektów StringBuffer zamiast rzeczywistych ciągów w StringBuffer.

System.out.println(sb1.toString().equals(sb2.toString())) Zwrócę prawdę i zakładam, że właśnie tego oczekiwałeś lub chciałeś osiągnąć.

2

StringBuffer wydaje się nie mieć equals metodę własną rękę, więc moje pierwsze przypuszczenie byłoby, że StringBuffer dziedziczy metodę equals z Object, w porównaniu z wykorzystaniem sb1 == sb2. Dlatego obie metody dają taki sam wynik.

2

zarówno porównuje dwa odniesienia do obiektów (sb1 to jeden, a sb2 jest drugi), a więc oba są różne.

Jeśli próbujesz porównać zawartość - sposób użycia compareTo (...) w String klasa - to - najpierw uzyskać String treść StringBuffer stosując metodę toString() (.toString(). compareTo).

Ps. od JDK 5 istnieje kolejna znacznie szybsza klasa, która zachowuje się dokładnie tak jak StringBuffer - jest to StringBuilder , a także jest , ale nie jest bezpieczna dla wątków.

StringBuffer sb1 = new StringBuffer("Java"); 
StringBuffer sb2 = new StringBuffer("Java"); 

System.out.println(sb1.toString().compareTo(sb2.toString())); 
+0

StringBuidler nie jest chroniony wątkami, o ile wiem, że – Yaneeve

+0

StringBuilder nie jest bezpieczny dla wątków. Z dokumentacji SDK w StringBuilder: "zgodny z StringBuffer, ale z ** bez gwarancji synchronizacji **", z akapitu wprowadzającego tutaj: http://java.sun.com/j2se/1.5.0/docs/api/ java/lang/StringBuilder.html –

+0

oczywiście, moje złe. przeczytaj dokument zbyt szybko StringBuffer, IT jest uzupełniony przez StringBuilder, więc jest przeznaczony do użycia przez pojedynczy wątek. Przepraszam za to. – mkolodziejski

4

Odpowiedź jest prosta, że ​​StringBuffer (i StringBuilder) nie przedefiniowanie semantyki bazowe Object.equals(). Tak więc equals na StringBuffer po prostu porówna odniesienia do obiektu.

W rzeczywistości, String, StringBuffer, StringBuilder i CharBuffer wszystko zaimplementować interfejs CharSequence i javadoc dla tego interfejsu to mówi:

Ten interfejs nie udoskonalenie ogólnych umów o równości i metody hashcode. Wynik porównania dwóch obiektów, które implementują CharSequence, jest zatem ogólnie niezdefiniowany. Każdy obiekt może być implementowany przez inną klasę i nie ma gwarancji, że każda klasa będzie w stanie testować swoje instancje pod kątem równości z tymi z drugiej. Dlatego niewłaściwe jest używanie arbitralnych instancji CharSequence jako elementów w zbiorze lub jako kluczy na mapie.

0

Zastanawiasz się, dlaczego StringBuffer nie zastępuje metody equals. Prawdopodobnie dlatego, że zawartość obiektu jest uzyskiwana metodą toString() i która ma pożądany sposób.

5

Metoda StringBuffer's równa równa się true tylko wtedy, gdy obiekt StringBuffer jest porównywany ze sobą. Zwraca wartość false w porównaniu z dowolnym innym obiektem StringBuffer, nawet jeśli zawierają one te same znaki.

To dlatego „==” sprawdza równość referencyjną a ponieważ zarówno SB1 i SB2 różne referencje obiektów, więc wyjście w tym przypadku jest „false”

Nadal, jeśli chcesz sprawdzić, czy zawartość jest równe w obu StringBuffer obiektów, można użyć tego:

sb1.toString().equals(sb2.toString()) 

2. System.out.println(sb1.equals(sb2)); 

to daje wyjście jako „fałszywe”, ponieważ .equals metoda() nie zostały przesłonięte w klasie StringBuffer. Używa więc metody .equals() z nadrzędnej klasy "Object". W klasie obiektu .equals() został napisany w celu sprawdzenia równości odniesienia.

Należy zauważyć, że sb3.equals (sb4) zwróci "true" w przypadku String. Ponieważ metoda .equals() została nadpisana w klasie String w celu sprawdzenia i dopasowania zawartości dwóch różnych łańcuchów.

0

Stringbuffer's equals() nie został zastąpiony. Nie porównuje wartości, porównuje tylko przypisania wartości referencyjnych. Właśnie dlatego dostajesz fałszywe, ponieważ obaj odnoszą się do różnych obiektów.

Powiązane problemy