Hvordan sammenligner jeg strenger i Java?
Jeg har brukt ==
-operatoren i programmet mitt for å sammenligne alle strengene mine så langt.
Imidlertid løp jeg inn i en feil, endret en av dem til .equals()
i stedet, og det løste feilen.
Er ==
dårlig? Når skal det og bør det ikke brukes? Hva er forskjellen?
726
3
==
tester for referanselikhet (om de er det samme objektet)..equals()
tester for verdilikhet (om de er logisk "like").Objects.equals() sjekker for
null
før du kaller.equals()
slik at du ikke trenger å gjøre det (tilgjengelig fra og med JDK7, også tilgjengelig i Guava).String.contentEquals() sammenligner innholdet i
String
med innholdet i en hvilken som helstCharSequence
(tilgjengelig siden Java 1.5).Hvis du vil teste om to strenger har samme verdi, vil du derfor sannsynligvis bruke
Objects.equals()
.Du vil nesten alltid bruke
Objects.equals()
. I den sjeldne situasjonen der du vet at du har å gjøre med interned strenger, kan du bruke==
.Fra JLS 3.10.5. String Literals:
Lignende eksempler finnes også i JLS 3.10.5-1.
Ja,
==
er dårlig for å sammenligne strenger (egentlig alle objekter, med mindre du vet at de er kanoniske).==
sammenligner bare objektreferanser..equals()
tester for likhet. For strenger vil de ofte være like, men som du har oppdaget, er det ikke alltid garantert.==
sammenligner objektreferanser i Java, og det er ikke noe unntak forString
-objekter.For å sammenligne det faktiske innholdet i objekter (inkludert
String
), må man brukeequals
-metoden.Hvis en sammenligning av to
String
-objekter ved hjelp av==
viser seg å væretrue
, er det fordiString
-objektene ble internalisert, og Java Virtual Machine har flere referanser som peker til samme forekomst avString
. Man bør ikke forvente at sammenligning av etString
-objekt med samme innhold som et annetString
-objekt ved hjelp av==
skal evalueres somtrue
.