2011-12-01 14 views
13

Zastanawiam się, czy istnieje lepszy sposób na zrobienie tego. Czuję, że może to być nieefektywne. Problem jest z powodów DB muszę porównać ciągi, które czasami mogą być puste lub nie.Lepszy sposób porównywania ciągów znaków, który mógłby być pusty.

public static boolean compareStrings(String str1, String str2){ 

    if(str1 == null && str2 == null) return true; 

    if(str1 != null && str2 != null){ 
     if(str1.equals(str2)) 
      return true; 
    } 

    return false; 
} 
+0

migrować do http: //codereview.stackexchange.com/...? –

+0

przepraszam, dzięki, zrobimy to w przyszłości – Maurycy

Odpowiedz

46

Zwykła idiom to:

return (str1 == null ? str2 == null : str1.equals(str2)); 
+19

Chciałbym tylko dodać, że robiłem to dla Androida i TextUtils.equals (a, b); robi dokładnie to – Maurycy

1

Ten kod będzie tylko nieefektywne, jeżeli powoduje zator w trakcie normalnego wykonywania programu. Jedynym sposobem sprawdzenia, czy tak jest, jest uruchomienie programu za pomocą profilera. Dopóki tego nie zrobisz i zobaczysz, że ta funkcja powoduje problemy z wydajnością, nie martwiłbym się o to.

+0

To może być trochę wybredne, bym się tym martwił, zwłaszcza bez profilowania. Zwykle nie używam profilerów, chyba że natknę się na wycieki pamięci. Mniej więcej zastanawiałem się, czy istnieje lepsza implementacja niż opracowanie własnej statycznej metody. Dziękuję – Maurycy

29

Mówisz, że potencjalnie pochodzą one z bazy danych. W tym momencie wszelkie nieefektywności wokół kilku testów nieważności są całkowicie nieistotne w porównaniu z kosztami zapytań do bazy danych, szczerze mówiąc. Skoncentruję się na czytelności.

W tym celu chciałbym rozpocząć korzystanie Guava i jego Objects Klasa:

boolean equal = Objects.equal(a, b); 

Spodziewam się, że mają być realizowane zgodnie z kodem Taymon, w zasadzie - ale miło jest mieć go w jeden miejscu .

EDYCJA: Dla Javy 7+ nie potrzebujesz Guawy. Możesz po prostu użyć java.util.Objects.equal(a, b).

+0

Jeśli chodzi o "czytelność" ... to naprawdę sprawia, że ​​myślę o 'object.ReferenceEquals', co nie jest dobrą rzeczą :( –

+0

@pst: Powinno ci to myśleć o statycznym' object.Equals' Metoda, która jest odpowiednikiem już wbudowana w .NET. –

+11

Dla każdego, kto ma do czynienia z tym niedawno, to samo jest teraz w Javie 7: [Objects.equals] (http://docs.oracle.com/javase/7 /docs/api/java/util/Objects.html#equals%28java.lang.Object,%20java.lang.Object%29) –

4

Jeśli jesteś otwarty na użyciu Apache Commons StringUtils następnie mają równych który porównuje dwa ciągi null bezpiecznych

Powiązane problemy