Nizovi.deepEquals

1. Pregled

U ovom uputstvu zaronit ćemo u detalje deepEquals metoda iz Nizovi razred. Vidjet ćemo kada bismo trebali koristiti ovu metodu i proći ćemo kroz nekoliko jednostavnih primjera.

Da biste saznali više o različitim metodama u java.util.Arrays predavanja, pogledajte naš brzi vodič.

2. Svrha

Trebali bismo koristiti deepEquals metoda kada želimo provjeriti jednakost između dva ugniježđena ili višedimenzionalna niza. Također, kada želimo usporediti dva niza sastavljena od korisnički definiranih objekata, kao što ćemo vidjeti kasnije, moramo nadjačati jednako metoda.

Hajde sada da saznamo više detalja o deepEquals metoda.

2.1. Sintaksa

Za početak ćemo pogledati potpis metode:

javne statičke logičke deepEquals (Object [] a1, Object [] a2)

Iz potpisa metode to primjećujemo ne možemo koristiti deepEquals za usporedbu dva jednodimenzionalna niza primitivnih tipova podataka. Za to moramo primitivni niz umetnuti u odgovarajući omot ili upotrijebiti Nizovi.jednak metoda koja je preopteretila metode za primitivne nizove.

2.2. Provedba

Analizom interne primjene metode to možemo vidjeti metoda ne samo da provjerava elemente najviše razine nizova već i rekurzivno provjerava svaki njegov podelement.

Stoga bismo trebali izbjegavajte upotrebu deepEquals metoda s nizovima koji imaju samoreferencu jer će ovo rezultirati a java.lang.StackOverflowError.

Dalje, saznajmo kakve rezultate možemo dobiti ovom metodom.

3. Izlaz

The Nizovi.deepEquals metoda vraća:

  • pravi ako su oba parametra isti objekt (imaju istu referencu)
  • pravi ako su oba parametra null
  • lažno ako je samo jedan od dva parametra null
  • lažno ako nizovi imaju različite duljine
  • pravi ako su oba polja prazna
  • pravi ako nizovi sadrže isti broj elemenata i ako je svaki par podelemenata duboko jednak
  • lažno u ostalim slučajevima

U sljedećem ćemo odjeljku pogledati neke primjere koda.

4. Primjeri

Sad je vrijeme da počnemo gledati deepEquals metoda u akciji. Štoviše, usporedit ćemo deepEquals metoda s jednako metoda iz istog Nizovi razred.

4.1. Jednodimenzionalni nizovi

Prvo, krenimo s jednostavnim primjerom i usporedimo dva jednodimenzionalna polja tipa Objekt:

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

To vidimo i jedno i drugo jednako i deepEquals metode se vraćaju pravi. Otkrijmo što se događa ako je jedan element naših nizova null:

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

Vidimo da obje tvrdnje prolaze. Stoga možemo zaključiti da kada se koristi deepEquals metoda, null vrijednosti se prihvaćaju na bilo kojoj dubini ulaznih nizova.

Ali pokušajmo još jednu stvar i provjerimo ponašanje ugniježđenim nizovima:

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

Ovdje doznajemo da je deepEquals vraća se pravi dok jednako vraća se lažno. Ovo je zbog deepEquals poziva se rekurzivno kada naiđe na niz, dok je jednako uspoređuje reference pod-nizova.

4.2. Višedimenzionalni nizovi primitivnih tipova

Dalje, provjerimo ponašanje pomoću višedimenzionalnih nizova. U sljedećem primjeru dvije metode imaju različite izlaze, naglašavajući činjenicu koju bismo trebali koristiti deepEquals umjesto jednako metoda kada uspoređujemo višedimenzionalne nizove:

 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. Multidimenzionalni nizovi korisnički definiranih objekata

Napokon, provjerimo ponašanje deepEquals i jednako metode prilikom ispitivanja jednakosti dvaju višedimenzionalnih nizova za korisnički definirani objekt:

Počnimo s izradom jednostavnog Osoba razred:

 razred Osoba {private int id; privatni naziv niza; privatno int doba; // konstruktor & 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; return id == person.id && name.equals (person.name) && age == person.age; }}

Potrebno je nadjačati jednako metoda za naše Osoba razred. Inače, zadano jednako metoda uspoređivat će samo reference objekata.

Također, uzmimo u obzir da, iako to nije relevantno za naš primjer, uvijek bismo trebali nadjačati hashCode kada nadjačamo jednako metodu kako ne bismo kršili njihove ugovore.

Dalje, možemo usporediti dva višedimenzionalna niza Osoba razred:

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

Kao rezultat rekurzivnog uspoređivanja podelemenata, dvije metode opet imaju različite rezultate.

Napokon, vrijedi spomenuti daObjects.deepEquals metoda izvršava Nizovi.deepEquals metoda interno kad se zove s dvoje Objekt nizovi:

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

5. Zaključak

U ovom smo brzom vodiču naučili da bismo trebali koristiti Nizovi.deepEquals metodu kada želimo usporediti jednakost između dva ugniježđena ili višedimenzionalna niza objekata ili primitivnih tipova.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.