Hvordan kan jeg sammenligne strenge i Java?
Jeg har brugt operatoren ==
i mit program til at sammenligne alle mine strenge indtil videre.
Jeg løb imidlertid ind i en fejl, ændrede en af dem til .equals()
i stedet, og det løste fejlen.
Er ==
dårligt? Hvornår skal den og hvornår skal den ikke bruges? Hvad'er forskellen?
726
3
==
tester for referencegyldighed (om de er det samme objekt)..equals()
tester for værdilighed (om de logisk set er "lige").Objects.equals() kontrollerer for
null
, før du kalder.equals()
, så du ikke behøver at gøre det (tilgængelig fra JDK7, også tilgængelig i Guava)).String.contentEquals() sammenligner indholdet af
String
med indholdet af en hvilken som helstCharSequence
(tilgængelig siden Java 1.5).Hvis du ønsker at teste, om to strenge har samme værdi, skal du derfor sandsynligvis bruge
Objects.equals()
.Du vil næsten altid bruge
Objects.equals()
. I den sjældne situation, hvor du ved at du har med interned strenge at gøre, kan du kan bruge==
.Fra JLS 3.10.5. String Literals:
Lignende eksempler kan også findes i JLS 3.10.5-1.
Ja,
==
er dårligt til sammenligning af strenge (og egentlig alle objekter, medmindre du ved, at de er kanoniske).==
sammenligner bare objektreferencer..equals()
tester for lighed. For Strings vil de ofte være ens, men som du har opdaget, er det ikke altid garanteret.==
sammenligner objektreferencer i Java, og det er ingen undtagelse forString
-objekter.For at sammenligne det faktiske indhold af objekter (herunder
String
) skal man brugeequals
-metoden.Hvis en sammenligning af to
String
-objekter ved hjælp af==
viser sig at væretrue
, skyldes det, atString
-objekterne blev internaliseret, og at Java Virtual Machine får flere referencer til at pege på den samme instans afString
. Man bør ikke forvente, at sammenligning af etString
-objekt, der indeholder det samme indhold som et andetString
-objekt ved hjælp af==
, vil blive evalueret somtrue
.