Sammenligne strenger i Java

1. Oversikt

I denne artikkelen vil vi snakke om de forskjellige måtene å sammenligne på Strenger i Java.

Som String er en av de mest brukte datatypene i Java, dette er naturlig nok en veldig vanlig operasjon.

2. String Sammenligning med String Klasse

2.1. Ved hjelp av “==” Sammenligningsoperatør

Å bruke “==” -operatøren for å sammenligne tekstverdier er en av de vanligste feilene Java-nybegynnere gjør. Dette er feil fordi “==” sjekker bare referanselikheten for to Strenger, mening hvis de refererer til det samme objektet eller ikke.

La oss se et eksempel på denne oppførselen:

String string1 = "bruker sammenligningsoperator"; String string2 = "bruker sammenligningsoperator"; Strengstreng3 = ny streng ("ved hjelp av sammenligningsoperator"); assertThat (string1 == string2) .isTrue (); assertThat (string1 == string3) .isFalse ();

I eksemplet ovenfor er den første påstanden sant fordi de to variablene peker på det samme String bokstavelig.

På den annen side er den andre påstanden falsk fordi streng1 er skapt med en bokstavelig og streng3 er opprettet ved hjelp av ny operatør - derfor refererer de til forskjellige objekter.

2.2. Ved hjelp av er lik()

De String klasse overstyrer er lik() arvet fra Gjenstand. Denne metoden sammenligner to Strenger karakter for karakter, ignorerer adressen.

Det anser dem like hvis de er av samme lengde og tegnene er i samme rekkefølge:

String string1 = "ved bruk av lik metode"; String string2 = "ved bruk av lik metode"; String string3 = "ved hjelp av EQUALS-metoden"; Strengstreng4 = ny streng ("ved bruk av lik metode"); assertThat (string1.equals (string2)). isTrue (); assertThat (string1.equals (string4)). isTrue (); assertThat (string1.equals (null)). isFalse (); assertThat (string1.equals (string3)). isFalse ();

I dette eksemplet, streng1, streng2, og streng4 variabler er like fordi de har samme sak og verdi uavhengig av adresse.

Til streng3 metoden returnerer falsk, ettersom det er skiftende og mellomrom

Også, hvis noen av de to strengene er null, så returnerer metoden falsk.

2.3. Ved hjelp av equalsIgnoreCase ()

De equalsIgnoreCase () metoden returnerer en boolsk verdi. Som navnet antyder denne metoden ignorerer bokstav i tegn mens du sammenligner Strenger:

String string1 = "ved bruk av like store bokstaver"; String string2 = "BRUKER EQUALS IGNORE CASE"; assertThat (string1.equalsIgnoreCase (string2)). isTrue ();

2.4. Ved hjelp av sammenligne med()

De sammenligne med() metoden returnerer en int type verdi og sammenligner to Strenger karakter for karakter leksikografisk basert på en ordbok eller naturlig bestilling.

Denne metoden returnerer 0 hvis to Strenger er like eller hvis begge er null, et negativt tall hvis det første String kommer før argumentet, og et tall større enn null hvis det første String kommer etter krangelen String.

La oss se et eksempel:

Stringforfatter = "forfatter"; Stringbok = "bok"; String duplicateBook = "book"; assertThat (author.compareTo (book)) .isEqualTo (-1); assertThat (book.compareTo (author)) .isEqualTo (1); assertThat (duplicateBook.compareTo (book)) .isEqualTo (0);

2.5. Ved hjelp av CompareToIgnoreCase ()

De CompareToIgnoreCase () ligner på den forrige metoden, bortsett fra at den ignorerer tilfelle:

Stringforfatter = "Forfatter"; Stringbok = "bok"; String duplicateBook = "BOOK"; assertThat (author.compareToIgnoreCase (bok)) .isEqualTo (-1); assertThat (book.compareToIgnoreCase (forfatter)) .isEqualTo (1); assertThat (duplikatBook.compareToIgnoreCase (bok)) .isEqualTo (0);

3. String Sammenligning med Objekter Klasse

Objekter er en bruksklasse som inneholder en statisk er lik() metode, nyttig i dette scenariet - for å sammenligne to Strenger.

Metoden returnerer ekte hvis to Strenger er like ved først sammenligne dem ved hjelp av adressen dvs "==”. Følgelig, hvis begge argumentene er det null, kommer den tilbake ekte og om akkurat ett argument er null, det returnerer falskt.

Ellers kaller det bare er lik() metoden for det godkjente argumentets type klasse - som i vårt tilfelle er String's klasse er lik() metode. Denne metoden er mellom store og små bokstaver fordi den internt kaller String klasse er lik() metode.

La oss teste dette:

String string1 = "bruk av objekter er lik"; String string2 = "bruk av objekter er lik"; Strengstreng3 = ny streng ("å bruke objekter er lik"); assertThat (Objects.equals (string1, string2)). isTrue (); assertThat (Objects.equals (string1, string3)). isTrue (); assertThat (Objects.equals (null, null)). isTrue (); assertThat (Objects.equals (null, string1)). isFalse ();

4. String Sammenligning med Apache Commons

Apache Commons-biblioteket inneholder en verktøyklasse som heter StringUtils til Streng-relaterte operasjoner; dette har også noen veldig fordelaktige metoder for String sammenligning.

4.1. Ved hjelp av er lik() og equalsIgnoreCase ()

De er lik() Metode av StringUtils class er en forbedret versjon av String klassemetode er lik(), som også håndterer nullverdier:

assertThat (StringUtils.equals (null, null)) .isTrue (); assertThat (StringUtils.equals (null, "tilsvarer metoden")) .isFalse (); assertThat (StringUtils.equals ("er lik metode", "er lik metode")) .isTrue (); assertThat (StringUtils.equals ("er lik metode", "LIKE METODE")) .isFalse ();

De equalsIgnoreCase () Metode av StringUtils returnerer a boolsk verdi. Dette fungerer på samme måte som er lik(), bortsett fra at det ignorerer innhylling av tegn i Strenger:

assertThat (StringUtils.equalsIgnoreCase ("er lik metode", "er lik metode")) .isTrue (); assertThat (StringUtils.equalsIgnoreCase ("er lik metode", "LIKE METODE")) .isTrue ();

4.2. Ved hjelp av equalsAny () og equalsAnyIgnoreCase ()

De equalsAny () metodens første argument er a String og den andre er en multi-args-type CharSequence. Metoden returnerer ekte hvis noe av det andre er gitt Strenger kamp mot den første String saksfølsomt.

Ellers returneres false:

assertThat (StringUtils.equalsAny (null, null, null)) .isTrue (); assertThat (StringUtils.equalsAny ("tilsvarer noe", "tilsvarer noe", "noe")) .isTrue (); assertThat (StringUtils.equalsAny ("tilsvarer noe", null, "tilsvarer noe")) .isTrue (); assertThat (StringUtils.equalsAny (null, "er lik", "hvilken som helst")) .isFalse (); assertThat (StringUtils.equalsAny ("tilsvarer noe", "LIKER NOEN", "NOEN")) .isFalse ();

De equalsAnyIgnoreCase () metoden fungerer på samme måte som equalsAny () metode, men ignorerer også foringsrør:

assertThat (StringUtils.equalsAnyIgnoreCase ("ignore case", "IGNORE CASE", "any")). isTrue ();

4.3. Ved hjelp av sammenligne() og sammenlignIgnoreCase ()

De sammenligne() metode i StringUtils klasse er en null-sikker versjon av sammenligne med() Metode av String klasse og håndtak null verdier etter vurderer en null verdi mindre enn en ikke-null verdi. To null verdier regnes som like.

Videre kan denne metoden brukes til å sortere en liste over Strenger med null innganger:

assertThat (StringUtils.compare (null, null)) .isEqualTo (0); assertThat (StringUtils.compare (null, "abc")) .isEqualTo (-1); assertThat (StringUtils.compare ("abc", "bbc")) .isEqualTo (-1); assertThat (StringUtils.compare ("bbc", "abc")) .isEqualTo (1);

De sammenlignIgnoreCase () metoden oppfører seg på samme måte, bortsett fra at den ignorerer foringsrør:

assertThat (StringUtils.compareIgnoreCase ("Abc", "bbc")) .isEqualTo (-1); assertThat (StringUtils.compareIgnoreCase ("bbc", "ABC")) .isEqualTo (1); assertThat (StringUtils.compareIgnoreCase ("abc", "ABC")) .isEqualTo (0);

De to metodene kan også brukes med en null er mindre alternativ. Dette er en tredje boolsk argument som avgjør om nullverdier skal betraktes som mindre eller ikke.

EN null verdien er lavere enn en annen String hvis null er mindre er sant og høyere hvis null er mindre er falsk.

La oss prøve det:

assertThat (StringUtils.compare (null, "abc", true)) .isEqualTo (-1); assertThat (StringUtils.compare (null, "abc", false)) .isEqualTo (1);

De sammenlignIgnoreCase () metode med en tredje boolsk argument fungerer på samme måte, bortsett fra ved å ignorere saken.

5. Konklusjon

I denne raske opplæringen diskuterte vi forskjellige måter å sammenligne på Strenger.

Og som alltid kan kildekoden for eksemplene finnes på GitHub.