Chcę porównać dwa ciągi znaków równości w Javie, gdy jedno lub oba mogą być null
, więc nie mogę po prostu wywołać .equals()
. Jaka jest najlepsza droga?
boolean compare(String str1, String str2) {
...
}
Edytować:
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
Odpowiedzi:
Oto, czego używa wewnętrzny kod Java (na innych
compare
metodach):źródło
<0
,==0
lub>0
w celu wskazania, który z nich jest / tarka niższy niż w innychObjects.equals(Object, Object)
jak wskazał Mark Rotteveel w swojej odpowiedzi (proszę głosować)Od wersji Java 7 można używać metody statycznej
java.util.Objects.equals(Object, Object)
do przeprowadzania kontroli równości na dwóch obiektach bez dbania o nienull
.Jeśli oba obiekty są
null
, zwrócitrue
, jeśli jeden jest,null
a drugi nie, to zwrócifalse
. W przeciwnym razie zwróci wynik wywołaniaequals
pierwszego obiektu z drugim argumentem.źródło
Object.equals(Object)
nie ma sprawdzania typu czasu kompilacji.Objects.equals(Object, Object)
Działa bardzo podobnie jak normalneequals
, a ponowne wnioskowanie / kontrole przeprowadzane przez IDE, zasady te są heurystyki, które również są obsługiwane przezObjects.equals(Object, Object)
(np IntelliJ IDEA 2016.2 ma taką samą kontrolę zarówno dla normalnych rówieśników i jednego z obiektów).W takich przypadkach lepiej byłoby użyć Apache Commons StringUtils # równa się , obsługuje już ciągi zerowe. Przykładowy kod:
Jeśli dont chcesz dodać do biblioteki, wystarczy skopiować kod źródłowy z
StringUtils#equals
metodą i stosuje się go, gdy jest to potrzebne.źródło
Dla Androida, który nie może korzystać z Objects.equals API 19's (str1, str2):
To jest bezpieczne. Rzadko musi używać droższej metody string.equals (), ponieważ identyczne ciągi w Androidzie prawie zawsze porównują prawdę z operandem „==” dzięki puli ciągów w Androidzie , a sprawdzanie długości to szybki sposób na odfiltrowanie większości niedopasowań.
Kod źródłowy:
źródło
Od wersji 3.5 Apache Commons StringUtils ma następujące metody:
Zapewniają one zerowe bezpieczne porównywanie ciągów.
źródło
Za pomocą Java 8:
źródło
Porównaj dwa ciągi za pomocą metody equals (-, -) i equalsIgnoreCase (-, -) klasy Apache Commons StringUtils.
StringUtils.equals (-, -) :
StringUtils.equalsIgnoreCase (-, -) :
źródło
Możesz użyć
java.util.Objects
w następujący sposób.źródło
czy tego właśnie chciałeś?
źródło
false
jeśli oba ciągi są,null
co może nie być pożądanym rezultatem.źródło
źródło
OK, więc co oznacza „najlepsze możliwe rozwiązanie”?
Jeśli masz na myśli najbardziej czytelny, wszystkie możliwe rozwiązania są prawie równoważne dla doświadczonego programisty Java. Ale IMO jest najbardziej czytelne
Innymi słowy, ukryj implementację w prostej metodzie, którą (najlepiej) można wstawić.
(Możesz również „przełączyć się” na bibliotekę narzędziową innej firmy ... jeśli już używasz jej w swojej bazie kodu.)
Jeśli masz na myśli najbardziej wydajne, to:
null
argumentów,źródło