Porovnanie reťazcov v Jave

1. Prehľad

V tomto článku si povieme o rôznych spôsoboch porovnávania Struny v Jave.

Ako String je jedným z najpoužívanejších dátových typov v Jave, je to samozrejme veľmi bežne používaná operácia.

2. String Porovnanie s String Trieda

2.1. Použitím “==” Operátor porovnania

Použitie operátora „==“ na porovnanie textových hodnôt je jednou z najčastejších chýb, ktoré začiatočníci Java robia. Toto je nesprávne, pretože “==” kontroluje iba referenčnú rovnosť dvoch Struny, čo znamená, či odkazujú na rovnaký objekt alebo nie.

Pozrime sa na príklad tohto správania:

Reťazec string1 = "pomocou porovnávacieho operátora"; Reťazec string2 = "pomocou porovnávacieho operátora"; String string3 = new String ("using comparison operator"); assertThat (string1 == string2) .isTrue (); assertThat (string1 == string3) .isFalse ();

Vo vyššie uvedenom príklade je prvé tvrdenie pravdivé, pretože obe premenné ukazujú na to isté String doslovne.

Na druhej strane je druhé tvrdenie nepravdivé, pretože reťazec1 je vytvorený s doslovným a reťazec3 sa vytvára pomocou Nový operátor - preto odkazujú na rôzne objekty.

2.2. Použitím rovná sa ()

The String trieda prepíše rovná sa () zdedil z Objekt. Táto metóda porovnáva dve Struny znak po znaku, ignorujúc ich adresu.

Považuje ich za rovnocenné, ak majú rovnakú dĺžku a znaky sú v rovnakom poradí:

String string1 = "using equals method"; Reťazec string2 = "pomocou metódy rovnosti"; Reťazec string3 = "pomocou metódy EQUALS"; String string4 = new String ("using equals method"); assertThat (string1.equals (string2)). isTrue (); assertThat (string1.equals (string4)). isTrue (); assertThat (string1.equals (null)). isFalse (); assertThat (string1.equals (string3)). isFalse ();

V tomto príklade string1, string2, a reťazec4 premenné sú rovnaké, pretože majú rovnaký prípad a hodnotu bez ohľadu na ich adresu.

Pre string3 metóda sa vráti nepravda, pretože sa rozlišujú veľké a malé písmená.

Tiež, ak niektorý z týchto dvoch reťazcov je nulový, potom sa metóda vráti nepravdivé.

2.3. Použitím equalsIgnoreCase ()

The equalsIgnoreCase () metóda vráti boolovskú hodnotu. Ako naznačuje názov tejto metódy pri porovnávaní ignoruje použitie veľkých a malých písmen v znakoch Struny:

String string1 = "using equals ignore case"; String string2 = "POUŽÍVANIE ROVNAKÉHO RIEŠENIA"; assertThat (string1.equalsIgnoreCase (string2)). isTrue ();

2.4. Použitím porovnať s()

The porovnať s() metóda vracia int hodnota typu a porovnáva dva Struny znak po znaku lexikograficky na základe slovníka alebo prirodzeného usporiadania.

Táto metóda vráti 0, ak dve Struny sú si rovné alebo ak sú obidve nulový, záporné číslo, ak je prvé String pred argumentom a číslo väčšie ako nula, ak je prvé String príde po hádke String.

Pozrime sa na príklad:

Autor reťazca = "autor"; Strunová kniha = "kniha"; Reťazec duplicateBook = "kniha"; assertThat (author.compareTo (kniha)) .isEqualTo (-1); assertThat (book.compareTo (autor)) .isEqualTo (1); assertThat (duplicateBook.compareTo (kniha)) .isEqualTo (0);

2.5. Použitím compareToIgnoreCase ()

The compareToIgnoreCase () je podobný predchádzajúcej metóde, ibaže ignoruje malé a veľké písmená:

Autor reťazca = "Autor"; Strunová kniha = "kniha"; Reťazec duplicateBook = "KNIHA"; assertThat (author.compareToIgnoreCase (kniha)) .isEqualTo (-1); assertThat (book.compareToIgnoreCase (autor)) .isEqualTo (1); assertThat (duplicateBook.compareToIgnoreCase (kniha)) .isEqualTo (0);

3. String Porovnanie s Predmety Trieda

Predmety je úžitková trieda, ktorá obsahuje static rovná sa () metóda užitočná v tomto scenári - na porovnanie dvoch Struny.

Metóda sa vráti pravda ak dve Struny sú si rovní o najprv ich porovnanie pomocou ich adresy tj „==”. Z toho vyplýva, že ak sú obidva argumenty nulový, vracia sa pravda a ak je presne jeden argument nulový, vráti hodnotu false.

V opačnom prípade potom jednoducho zavolá rovná sa () metóda triedy typu odovzdaného argumentu - čo je v našom prípade Reťazec trieda rovná sa () metóda. Táto metóda rozlišuje veľké a malé písmená, pretože interne volá String triedy rovná sa () metóda.

Vyskúšajme to:

Reťazec string1 = "použitie objektov sa rovná"; Reťazec string2 = "použitie objektov sa rovná"; String string3 = new String ("using objects equals"); 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 Porovnanie s Apache Commons

Knižnica Apache Commons obsahuje triedu nástrojov nazvanú StringUtils pre Reťazec-súvisiace operácie; toto má tiež niekoľko veľmi prospešných metód pre String porovnanie.

4.1. Použitím rovná sa () a equalsIgnoreCase ()

The rovná sa () metóda StringUtils trieda je vylepšená verzia String triedna metóda rovná sa (), ktorý tiež spracováva nulové hodnoty:

assertThat (StringUtils.equals (null, null)) .isTrue (); assertThat (StringUtils.equals (null, "rovná sa metóda")) .isFalse (); assertThat (StringUtils.equals ("metóda rovná sa", "metóda rovná sa")) .isTrue (); assertThat (StringUtils.equals ("metóda rovná sa", "METÓDA ROVNICE")) .isFalse ();

The equalsIgnoreCase () metóda StringUtils vracia a boolovský hodnotu. Funguje to podobne ako v prípade rovná sa (), okrem toho, že ignoruje veľké a malé písmená v znakoch v Struny:

assertThat (StringUtils.equalsIgnoreCase ("rovná sa metóda", "rovná sa metóda")) .isTrue (); assertThat (StringUtils.equalsIgnoreCase ("metóda rovná sa", "METÓDA ROVNAKA")) .isTrue ();

4.2. Použitím equalsAny () a equalsAnyIgnoreCase ()

The equalsAny () Prvý argument metódy je a String a druhý je multi-argový typ CharSequence. Metóda sa vráti pravda ak je niektorý z ďalších uvedených Struny zápas proti prvému String prípad citlivo.

V opačnom prípade sa vráti hodnota false:

assertThat (StringUtils.equalsAny (null, null, null)) .isTrue (); assertThat (StringUtils.equalsAny ("rovná sa akýkoľvek", "rovná sa akýkoľvek", "akýkoľvek")) .isTrue (); assertThat (StringUtils.equalsAny ("rovná sa", null, "rovná sa")) .isTrue (); assertThat (StringUtils.equalsAny (null, "equals", "any")) .isFalse (); assertThat (StringUtils.equalsAny ("rovná sa akýkoľvek", "AKÝKOĽVEK ROVNÝ", "AKÝKOĽVEK")) .isFalse ();

The equalsAnyIgnoreCase () metóda funguje podobne ako equalsAny () metóda, ale ignoruje aj veľkosť písmen:

assertThat (StringUtils.equalsAnyIgnoreCase ("ignorovať prípad", "IGNORE CASE", "any")). isTrue ();

4.3. Použitím porovnaj () a compareIgnoreCase ()

The porovnať () metóda v StringUtils trieda je a nulová bezpečná verzia porovnať s() metóda String triedy a kľučky nulový hodnoty o vzhľadom na a nulový hodnota menšia ako a nenulový hodnotu. Dva nulový hodnoty sa považujú za rovnaké.

Ďalej je možné túto metódu použiť na triedenie zoznamu Struny s nulový záznamy:

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);

The compareIgnoreCase () metóda sa správa podobne, ibaže ignoruje veľké a malé písmená:

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

Tieto dve metódy sa dajú použiť aj s a nullIsLess možnosť. Toto je tretina boolovský argument, ktorý rozhoduje o tom, či sa majú nulové hodnoty považovať za menšie alebo nie.

A nulový hodnota je nižšia ako iná String ak nullIsLess je pravda a vyššia ak nullIsLess je nepravdivé.

Vyskúšajme to:

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

The compareIgnoreCase () metóda s tretinou boolovský argument funguje podobne, ibaže ignoruje veľké a malé písmená.

5. Záver

V tomto rýchlom návode sme diskutovali o rôznych spôsoboch porovnávania Struny.

A ako vždy, zdrojový kód príkladov nájdete na GitHub.