2010-10-07 23 views
7

Kiedy należy porównywać obiekty String s i kiedy należy zastosować metodę equals? Aby się upewnić, zawsze używam equals, ale to nie wydaje się bardzo wydajne. W jakich sytuacjach mogę być pewny, że bezpieczne jest używanie string1 == string2?Porównywanie ciągów znaków i stringów w języku Java

Dzięki!

+3

Funkcja String.equals() jest wydajna. Najpierw sprawdzamy, czy string1 == string2. (W rzeczywistości Object.equals() to sprawdza.) –

+0

Ale oczywiście! Ale jestem głupi. To bardzo oczywiste. I bardzo wydajny, jak mówisz. Nigdy z tego. * Wstyd mi! * Dzięki! –

Odpowiedz

16

Powinieneś mieć prawie zawsze zawsze używać equals. Możesz mieć pewność, że będzie działać, jeśli string1 == string2:

  • ty już upewnił się, że masz różne wartości w jakiś inny sposób (np których używasz wartości ciągów pobranego ze zbioru, ale porównując je dla niektórych inna przyczyna)
  • wiesz, masz do czynienia z kompilacji ciąg stałych
  • pan ręcznie internowany struny bardziej

To naprawdę nie zdarza się bardzo często, w moim doświadczeniu.

+0

Dziękuję Jon, zawsze umieszczasz rzeczy prosto i wyraźnie. –

+1

Absolutnie właściwa odpowiedź. Użycie '==', ponieważ equals() jest nieefektywne, jest doskonałym przykładem przedwczesnej optymalizacji. – DJClayworth

+0

A String.intern() jest wystarczająco powolny, aby być bezużytecznym dla wydajności w większości przypadków. – Darron

1

Z tego, co wiem o Javie, string1==string2 będzie prawdą tylko wtedy, gdy odniesienia do tych obiektów są takie same. Spójrz w następującym przypadku

String string1 = new String("Bob"); 
String string2 = new String("Bob"); 

string1 == string2; // false, they are seperate objects 
string1 = string2; // asigning string1 to string2 object 
string1 == string2; // true, they both refer to the same object 
+2

Pierwsze porównanie * nie * będzie fałszywe, ponieważ są * nie * oddzielnymi obiektami. Literały łańcuchowe są internowane w Javie. – sepp2k

+0

Pierwsze porównanie powinno zwrócić false w tym przypadku - String string1 = new ("Bob"); String string2 = new ("Bob"); – stratwine

+0

Zmienię moją odpowiedź, aby była jaśniej określona. Pomyślałem, że mogę uruchomić ten problem z Javą. – Anthony

0

Można używać tylko == dla porównania, jeśli jesteś pewien, że obiekty są takie same.

Na przykład może się tak zdarzyć, jeśli masz ostatnią statyczną zmienną String. Możesz być pewien, że porównanie będzie pomiędzy tym samym obiektem.

Trzymaj z equals dla porównania ciągów.

Powiązane problemy