2012-06-13 17 views
13

Mam dwa obiekty StringBuilder, muszę je porównać w Javie. Jednym ze sposobów, wiem, że mogę zrobić toJaki jest skuteczny sposób porównywania obiektów StringBuilder

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

ale to oznacza tworzę dwa obiekty ciąg, czy jest jakiś lepszy sposób, aby porównać StringBuilder obiektów. Prawdopodobnie coś, co nie wymaga tworzenia dodatkowych obiektów?

+6

Jestem zaskoczony, że 'StringBuilder' nie deklaruje własnej metody' równa się'. – Jeffrey

+0

to, co robisz, jest najlepszym sposobem na zrobienie tego, nie dopuszczając do przekroczenia dużych obiektów typu "String". –

Odpowiedz

26

Jak widać już wiedzą, StringBuilder dziedziczy equals() z java.lang.Object i jako takie StringBuilder.equals() zwraca true tylko wtedy, gdy przeszedł samego obiektu jako argument. Jest to nie porównaj zawartość dwóch StringBuilder s!

Jeśli spojrzysz na źródło, dojdziesz do wniosku, że najbardziej efektywnym porównaniem (które nie wymagało tworzenia żadnych nowych obiektów) byłoby porównanie wartości zwracanych przez .length(), a jeśli są takie same, porównaj zwracaj wartości charAt(i) dla każdej postaci.

+0

To właśnie robi plik sb1.equals (sb2). – jjm

+12

Nie, to absolutnie, całkowicie, całkowicie ** NIE. ** –

+0

@jjm: Czy masz link do kodu źródłowego, abyśmy mogli to sprawdzić? – Gabe

3

Dwa obiekty StringBuilder nigdy nie są równe. Użyj .toString(), aby uzyskać reprezentację ciągów dla obu obiektów, a następnie użyj .equals() do porównania obiektów. W ten sposób uzyskuje się metodę equals() z klasy String, która porównuje wartość ciągów obiektów zamiast porównywać lokalizację pamięci.

StringBuilder a= new StringBuilder("HELLO JAVA"); 
StringBuilder b= new StringBuilder("HELLO JAVA"); 
if (a.toString().equals(b.toString())){ 
System.out.println("Objects are equal"); 
} 
+0

Ale to nie jest wydajne jak Ty utworzyć nową instancję String jest przydzielana. – alobodzk

0

Można użyć metody contentEquals() ciągu znaków.

StringBuilder s = new StringBuilder("abc"); 
StringBuilder t = new StringBuilder("def"); 

if(s.contentEquals(new String(t)) { 
    System.out.println("Same"); 
} 
+0

s musi być ciągiem, a nie obiektem typu StringBuilder. –

Powiązane problemy