Arrays.deepEquals

1. Prehľad

V tomto výučbe sa ponoríme do podrobností deepEquals metóda z Polia trieda. Uvidíme, kedy by sme mali použiť túto metódu, a ukážeme si niekoľko jednoduchých príkladov.

Ak sa chcete dozvedieť viac o rôznych metódach v dokumente java.util.Arrays triedy, pozrite si nášho rýchleho sprievodcu.

2. Účel

Mali by sme Použi deepEquals metóda, keď chceme skontrolovať rovnosť medzi dvoma vnorenými alebo viacrozmernými poliami. Pokiaľ chceme porovnávať dve polia zložené z objektov definovaných používateľom, ako uvidíme neskôr, musíme prepísať rovná sa metóda.

Teraz sa poďme dozvedieť viac podrobností o deepEquals metóda.

2.1. Syntax

Začneme tým, že sa pozrieme na podpis metódy:

public static boolean deepEquals (Object [] a1, Object [] a2)

Z podpisu metódy si to všimneme nemôžeme použiť deepEquals na porovnanie dvoch unidimenzionálnych polí primitívnych dátových typov. Za týmto účelom musíme primitívne pole buď zabaliť do zodpovedajúceho obalu alebo použiť Polia. Rovnocenné metóda, ktorá má pre primitívne polia preťažené metódy.

2.2. Implementácia

Analýzou internej implementácie metódy to vidíme metóda nielenže kontroluje prvky najvyššej úrovne polí, ale aj rekurzívne kontroluje každý jej podpriečinok.

Preto by sme mali nepoužívajte deepEquals metóda s poľami, ktoré majú vlastnú referenciu pretože výsledkom bude a java.lang.StackOverflowError.

Ďalej zistíme, aký výstup môžeme z tejto metódy dostať.

3. Výstup

The Arrays.deepEquals metóda vracia:

  • pravda ak sú oba parametre rovnaký objekt (majú rovnakú referenciu)
  • pravda ak sú oba parametre nulový
  • nepravdivé ak je iba jeden z dvoch parametrov nulový
  • nepravdivé ak majú polia rôzne dĺžky
  • pravda ak sú obe polia prázdne
  • pravda ak polia obsahujú rovnaký počet prvkov a každá dvojica čiastkových prvkov je hlboko rovnaká
  • nepravdivé v ostatných prípadoch

V nasledujúcej časti sa pozrieme na niektoré príklady kódu.

4. Príklady

Teraz je čas začať sa pozerať deepEquals metóda v akcii. Okrem toho porovnáme deepEquals metóda s rovná sa metóda z toho istého Polia trieda.

4.1. Unidimensional Arrays

Najprv začnime jednoduchým príkladom a porovnajme dve jednorozmerné polia typu Objekt:

 Object [] anArray = new Object [] {"string1", "string2", "string3"}; Object [] anotherArray = new Object [] {"string1", "string2", "string3"}; assertTrue (Arrays.equals (anArray, anotherArray)); assertTrue (Arrays.deepEquals (anArray, anotherArray));

Vidíme, že obaja rovná sa a deepEquals metódy sa vracajú pravda. Poďme zistiť, čo sa stane, ak jeden prvok z našich polí bude nulový:

 Object [] anArray = new Object [] {"string1", null, "string3"}; Object [] anotherArray = new Object [] {"string1", null, "string3"}; assertTrue (Arrays.equals (anArray, anotherArray)); assertTrue (Arrays.deepEquals (anArray, anotherArray));

Vidíme, že obe tvrdenia pominú. Preto môžeme dospieť k záveru, že pri použití deepEquals metóda, nulový hodnoty sú akceptované v akejkoľvek hĺbke vstupných polí.

Skúsme však ešte jednu vec a skontrolujme správanie pomocou vnorených polí:

 Object [] anArray = new Object [] {"string1", null, new String [] {"nestedString1", "nestedString2"}}; Object [] anotherArray = new Object [] {"string1", null, new String [] {"nestedString1", "nestedString2"}}; assertFalse (Arrays.equals (anArray, anotherArray)); assertTrue (Arrays.deepEquals (anArray, anotherArray));

Tu zistíme, že deepEquals vracia pravda zatiaľ čo rovná sa vracia nepravdivé. To je preto, že deepEquals volá sa rekurzívne pri stretnutí s poľom, zatiaľ čo equals iba porovnáva referencie podradených polí.

4.2. Multidimenzionálne polia primitívnych typov

Ďalej skontrolujme správanie pomocou viacrozmerných polí. V nasledujúcom príklade majú tieto dve metódy odlišné výstupy, ktoré zdôrazňujú skutočnosť, ktorú by sme mali použiť deepEquals namiesto rovná sa metóda, keď porovnávame viacrozmerné polia:

 int [] [] anArray = {{1, 2, 3}, {4, 5, 6, 9}, {7}}; int [] [] anotherArray = {{1, 2, 3}, {4, 5, 6, 9}, {7}}; assertFalse (Arrays.equals (anArray, anotherArray)); assertTrue (Arrays.deepEquals (anArray, anotherArray));

4.3. Multidimenzionálne polia objektov definovaných používateľom

Na záver skontrolujme správanie deepEquals a rovná sa metódy pri testovaní rovnosti dvoch viacrozmerných polí pre objekt definovaný používateľom:

Začnime vytvorením jednoduchého Osoba trieda:

 trieda Osoba {private int id; súkromné ​​meno reťazca; súkromný int vek; // constructor & getters & setters @Override public boolean equals (Object obj) {if (this == obj) {return true; } if (obj == null) {return false; } if (! (obj instanceof Person)) return false; Osoba osoba = (Osoba) obj; návrat id == person.id && name.equals (person.name) && age == person.age; }}

Je potrebné prekonať rovná sa metóda pre naše Osoba trieda. Inak predvolené rovná sa metóda porovná iba referencie objektov.

Berme tiež do úvahy, že aj keď to pre náš príklad nie je relevantné, mali by sme vždy prepísať hashCode keď prepíšeme rovná sa metódou, aby sme neporušili ich zmluvy.

Ďalej môžeme porovnať dve multidimenzionálne polia Osoba trieda:

 Osoba personArray1 [] [] = {{nová osoba (1, "John", 22), nová osoba (2, "Mike", 23)}, {nová osoba (3, "Steve", 27), nová osoba ( 4, „Gary", 28)}}; Osoba personArray2 [] [] = {{nová osoba (1, "John", 22), nová osoba (2, "Mike", 23)}, {nová osoba (3, "Steve", 27), nová osoba ( 4, „Gary", 28)}}; assertFalse (Arrays.equals (personArray1, personArray2)); assertTrue (Arrays.deepEquals (personArray1, personArray2));

Výsledkom rekurzívneho porovnania čiastkových prvkov sú tieto dve metódy, ktoré majú opäť odlišné výsledky.

Na záver stojí za zmienku, že:Objects.deepEquals metóda vykonáva Arrays.deepEquals metóda interne keď sa volá dvoma Objekt polia:

 assertTrue (Objects.deepEquals (personArray1, personArray2));

5. Záver

V tomto rýchlom výučbe sme sa naučili, že by sme mali používať Arrays.deepEquals metóda, keď chceme porovnávať rovnosť medzi dvoma vnorenými alebo viacrozmernými poľami objektov alebo primitívnych typov.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found