Arrays.deepEquals

1. Oversikt

I denne opplæringen vil vi dykke ned i detaljene i deepEquals metoden fra Arrays klasse. Vi får se når vi skal bruke denne metoden, og vi vil gå gjennom noen enkle eksempler.

For å lære mer om de forskjellige metodene i java.util.Arrayer klasse, sjekk ut vår hurtigguide.

2. Formål

Vi burde bruke deepEquals metode når vi vil sjekke likheten mellom to nestede eller flerdimensjonale matriser. Når vi vil sammenligne to matriser sammensatt av brukerdefinerte objekter, som vi vil se senere, må vi også overstyre er lik metode.

La oss nå finne ut mer detaljer om deepEquals metode.

2.1. Syntaks

Vi begynner med å se på metodesignatur:

offentlig statisk boolsk deepEquals (Object [] a1, Object [] a2)

Fra metodesignaturen merker vi det vi kan ikke bruke deepEquals å sammenligne to ensdimensjonale matriser med primitive datatyper. For dette må vi enten bokse den primitive matrisen til den tilsvarende innpakningen eller bruke Arrays. Like metode, som har overbelastet metoder for primitive matriser.

2.2. Gjennomføring

Ved å analysere metodens interne implementering, kan vi se det metoden sjekker ikke bare elementene på toppnivå i matrisen, men sjekker også rekursivt alle underelementer av den.

Derfor burde vi unngå å bruke deepEquals metode med matriser som har en egenreferanse fordi dette vil resultere i en java.lang.StackOverflowError.

Deretter, la oss finne ut hvilken produksjon vi kan få fra denne metoden.

3. Utgang

De Arrays.deepEquals metoden returnerer:

  • ekte hvis begge parametrene er det samme objektet (har samme referanse)
  • ekte hvis begge parametrene er null
  • falsk hvis bare en av de to parametrene er null
  • falsk hvis matriser har forskjellige lengder
  • ekte hvis begge matriser er tomme
  • ekte hvis matriser inneholder samme antall elementer og hvert par underelementer er dypt like
  • falsk i andre tilfeller

I neste avsnitt ser vi på noen kodeeksempler.

4. Eksempler

Nå er det på tide å begynne å se på deepEquals metode i aksjon. Videre vil vi sammenligne deepEquals metoden med er lik metode fra det samme Arrays klasse.

4.1. Endimensjonale matriser

For det første, la oss starte med et enkelt eksempel og sammenligne to ensdimensjonale matriser av typen Gjenstand:

 Objekt [] anArray = nytt objekt [] {"streng1", "streng2", "streng3"}; Objekt [] anotherArray = nytt objekt [] {"streng1", "streng2", "streng3"}; assertTrue (Arrays.equals (anArray, anotherArray)); assertTrue (Arrays.deepEquals (anArray, anotherArray));

Vi ser at begge deler er lik og deepEquals metodene kommer tilbake ekte. La oss finne ut hva som skjer hvis ett av elementene våre er null:

 Objekt [] anArray = nytt objekt [] {"streng1", null, "streng3"}; Objekt [] anotherArray = nytt objekt [] {"streng1", null, "streng3"}; assertTrue (Arrays.equals (anArray, anotherArray)); assertTrue (Arrays.deepEquals (anArray, anotherArray));

Vi ser at begge påstandene går forbi. Derfor kan vi konkludere med at når du bruker deepEquals metode, null verdiene aksepteres i hvilken som helst dybde i inngangsarrayene.

Men la oss prøve en ting til, og la oss sjekke oppførselen med nestede matriser:

 Objekt [] anArray = nytt objekt [] {"streng1", null, ny streng [] {"nestedString1", "nestedString2"}}; Objekt [] anotherArray = nytt objekt [] {"streng1", null, ny streng [] {"nestedString1", "nestedString2"}}; assertFalse (Arrays.quals (anArray, anotherArray)); assertTrue (Arrays.deepEquals (anArray, anotherArray));

Her finner vi ut at deepEquals returnerer ekte samtidig som er lik returnerer falsk. Dette er fordi deepEquals kaller seg rekursivt når man møter en matrise, mens lik bare sammenligner referansene til underarrayene.

4.2. Flerdimensjonale matriser av primitive typer

Deretter, la oss sjekke oppførselen ved hjelp av flerdimensjonale matriser. I det neste eksemplet har de to metodene forskjellige utganger, og understreker det faktum at vi bør bruke deepEquals i stedet for er lik metode når vi sammenligner flerdimensjonale matriser:

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

4.3. Flerdimensjonale matriser av brukerdefinerte objekter

Til slutt, la oss sjekke oppførselen til deepEquals og er lik metoder når man tester likheten mellom to flerdimensjonale matriser for et brukerdefinert objekt:

La oss starte med å lage en enkel Person klasse:

 klasse Person {privat int id; privat strengnavn; privat alder; // constructor & getters & setters @Override public boolean equals (Object obj) {if (this == obj) {return true; } if (obj == null) {return false; } hvis (! (obj instans av person)) returnerer falsk; Person person = (Person) obj; retur id == person.id && name.equals (person.name) && age == person.age; }}

Det er nødvendig å overstyre er lik metode for vår Person klasse. Ellers er standard er lik metoden vil bare sammenligne referansene til objektene.

La oss også ta i betraktning at selv om det ikke er relevant for vårt eksempel, bør vi alltid overstyre hashCode når vi overstyrer er lik metode slik at vi ikke bryter kontraktene deres.

Deretter kan vi sammenligne to flerdimensjonale matriser av Person klasse:

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

Som et resultat av å rekursivt sammenligne underelementene, har de to metodene igjen forskjellige resultater.

Til slutt er det verdt å nevne atObjects.deepEquals metoden utfører Arrays.deepEquals metode internt når det heter med to Gjenstand matriser:

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

5. Konklusjon

I denne raske opplæringen lærte vi at vi skulle bruke Arrays.deepEquals metode når vi ønsker å sammenligne likhet mellom to nestede eller flerdimensjonale matriser av objekter eller primitive typer.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


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