Porovnávanie polí v Jave

1. Prehľad

V tomto návode sa pozrieme na rôznymi spôsobmi porovnania polí v Jave. Budeme sa venovať konvenčným metódam a tiež si ukážeme niekoľko príkladov použitia lambdavýrazy.

2. Porovnanie polí

Budeme porovnávať polia v Jave a ako vieme, sú to objekty. Obnovme si preto niektoré základné pojmy:

  • Objekty majú referencie a hodnoty
  • Dva rovnaké odkazy by mali smerovať na rovnakú hodnotu
  • Dve rôzne hodnoty by mali mať odlišné referencie
  • Dve rovnaké hodnoty nemusia mať nevyhnutne rovnaké referencie
  • Primitívne hodnoty sa porovnávajú iba podľa hodnoty
  • Reťazcové literály sa porovnávajú iba podľa hodnoty

2.1. Porovnanie referencií na objekty

Ak máme dva odkazy smerujúce na to isté pole, mali by sme vždy dostať výsledok pravda v rovnakom porovnaní s == operátor.

Pozrime sa na príklad:

Reťazec [] planes1 = nový Reťazec [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Reťazec [] roviny2 = roviny1;

Najskôr sme vytvorili rad rovinných modelov, na ktoré odkazuje lietadlá1. Potom tvoríme lietadla2, ktorý odkazuje lietadlá1. Týmto sme vytvorenie dvoch referenciído toho istého poľa v pamäti. Preto „Roviny1 == roviny2“ výraz sa vráti pravda.

Pre polia platí: rovná sa () metóda je rovnaká ako u operátora ==. Takže roviny1. rovne (roviny 2) vracia pravda pretože oba odkazy odkazujú na rovnaký objekt. Všeobecne povedané, pole1.eqauls (pole2) vráti sa pravda len a len ak výraz pole1 == pole2 ″ vracia pravda.

Tvrdíme, či sú dva odkazy rovnaké:

assertThat (roviny1) .isSameAs (roviny2);

Poďme si byť istí, že hodnoty, na ktoré odkazuje lietadlá1 sú v skutočnosti rovnaké ako odkazy, na ktoré odkazuje lietadla2. Preto môžeme zmeniť pole, na ktoré odkazuje roviny2, a skontrolujte, či zmeny majú nejaký vplyv na pole, na ktoré sa odkazuje lietadlá1:

roviny2 [0] = "747";

Aby sme konečne videli, že to funguje, urobme naše tvrdenia:

assertThat (roviny1) .isSameAs (roviny2); assertThat (roviny2 [0]). isEqualTo ("747"); assertThat (roviny1 [0]). isEqualTo ("747");

Pomocou tohto jednotkového testu sme boli schopní porovnať dve polia pomocou referencie.

Dokázali sme to však iba jeden odkaz, akonáhle je priradený k hodnote iného, ​​bude odkazovať na rovnakú hodnotu.

Teraz vytvoríme dve rôzne polia s rovnakými hodnotami:

Reťazec [] planes1 = nový Reťazec [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Reťazec [] planes2 = nový Reťazec [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"};

Keďže ide o rôzne objekty, s istotou vieme, že nie sú rovnaké. Môžeme ich preto porovnať:

assertThat (roviny1) .isNotSameAs (roviny2);

Ak to zhrnieme, v tomto prípade máme v pamäti dve polia, ktoré obsahujú rovnaké String hodnoty v úplne rovnakom poradí. Nielenže sa však odkazované polia líšia aj obsahom, ale aj samotné referencie.

2.2. Porovnávanie dĺžok polí

Dĺžka polí je možné porovnávať bez ohľadu na to ich typov prvkov alebo či sú alebo nie sú vyplnené ich hodnoty.

Vytvorme dve polia:

konečný reťazec [] roviny1 = nový reťazec [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; konečné celé číslo [] množstvá = nové celé číslo [] {10, 12, 34, 45, 12, 43, 5, 2};

Jedná sa o dve rôzne polia s rôznymi typmi prvkov. V tejto množine údajov napríklad registrujeme, koľko letúnov každého modelu je uložených v sklade. Teraz na nich spustíme jednotkové testy:

assertThat (roviny1) .hasSize (8); assertThat (množstvá) .hasSize (8);

Týmto sme dokázali, že obe polia majú osem prvkov a že dĺžka property vráti správny počet prvkov pre každé pole.

2.3. Porovnávanie polí s Polia. Rovnocenné

Doteraz sme porovnávali iba polia na základe ich totožnosti objektov. Na druhej strane, na skontrolovanie, či sú si dve polia z hľadiska obsahu rovné, poskytuje Java Polia. Rovnocenné statická metóda. Táto metóda bude iterovať poliami paralelne na každú pozíciu a použije operátor ==,pre každú dvojicu prvkov.

Vytvorme dve rôzne polia s rovnakým String literály v úplne rovnakom poradí:

Reťazec [] planes1 = nový Reťazec [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Reťazec [] planes2 = nový Reťazec [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"};

A teraz tvrdíme, že sú si rovní:

assertThat (Arrays.equals (roviny 1, roviny 2)). isTrue ();

Ak zmeníme poradie hodnôt druhého poľa:

Reťazec [] planes1 = nový Reťazec [] {"A320", "B738", "A321", "A319", "B77W", "B737", "A333", "A332"}; Reťazec [] planes2 = nový Reťazec [] {"B738", "A320", "A321", "A319", "B77W", "B737", "A333", "A332"}; 

Dostaneme iný výsledok:

assertThat (Arrays.equals (roviny 1, roviny 2)). isFalse ();

2.4. Porovnávanie polí s Arrays.deepEquals

Pomocou == operátor je jednoduchý, ak používame v Jave jednoduché typy. Mohli by to byť primitívne typy resp String literály. Porovnanie medzi poľami Objekts môže byť komplikovanejšia. Dôvod je úplne vysvetlený v našom Arrays.deepEquals článok. Pozrime sa na príklad.

Najprv začnime s Rovina trieda:

public class Plane {private final Názov reťazca; súkromný konečný reťazcový model; // zakladatelia a zakladatelia}

A poďme implementovať hashCode a rovná sa metódy:

@ Override public boolean equals (Object o) if (this == o) return true; if (o == null @Override public int hashCode () {return Objects.hash (meno, model);}

Po druhé, vytvorme nasledujúce dvojprvkové polia:

Rovina [] [] planes1 = nové lietadlo [] [] {nové lietadlo [] {nové lietadlo („Rovina 1“, „A320“)}, nové lietadlo [] {nové lietadlo („Rovina 2“, „B738“) }}; Rovina [] [] planes2 = nové lietadlo [] [] {nové lietadlo [] {nové lietadlo („Rovina 1“, „A320“)}, nové lietadlo [] {nové lietadlo („Rovina 2“, „B738“) }}; 

Pozrime sa teraz, či sú to pravdivé, hlboko rovnaké polia:

assertThat (Arrays.deepEquals (roviny 1, roviny 2)). isTrue ();

Aby sme sa uistili, že naše porovnanie funguje podľa očakávaní, zmeňme teraz poradie nášho posledného poľa:

Rovina [] [] planes1 = nové lietadlo [] [] {nové lietadlo [] {nové lietadlo („Rovina 1“, „A320“)}, nové lietadlo [] {nové lietadlo („Rovina 2“, „B738“) }}; Rovina [] [] planes2 = nové lietadlo [] [] {nové lietadlo [] {nové lietadlo („Rovina 2“, „B738“)}, nové lietadlo [] {nové lietadlo („Rovina 1“, „A320“) }};

Na záver otestujme, či už skutočne nie sú rovnaké:

assertThat (Arrays.deepEquals (roviny 1, roviny 2)). isFalse ();

2.5. Porovnanie polí s rôznymi poradiami prvkov

Ak chcete skontrolovať, či sú polia rovnaké, bez ohľadu na poradie prvkov, musíme ich definovať čo robí jednu inštanciu našou Rovina jedinečný. Pre náš prípad stačí iný názov alebo model, aby sme určili, že jedna rovina sa líši od druhej. Zistili sme to tým, že sme už implementovali obe hashCode a rovná sa metódy. To znamená, že skôr ako budeme môcť porovnávať naše polia, mali by sme ich triediť. Na to potrebujeme Komparátor:

Komparátor planeComparator = (o1, o2) -> {if (o1.getName (). Equals (o2.getName ())) {return o2.getModel (). CompareTo (o1.getModel ()); } návrat o2.getName (). compareTo (o1.getName ()); };

V tomto Komparátor, uprednostňujeme meno. Ak sú mená rovnaké, nejednoznačnosť vyriešime pohľadom na model. Reťazce porovnávame pomocou znaku porovnať s metóda typu String.

Chceme byť schopní zistiť, či sú polia rovnaké bez ohľadu na poradie triedenia. Aby sme to dosiahli, poďme teraz zoradiť naše polia:

Arrays.sort (roviny1 [0], planeComparator); Arrays.sort (roviny2 [0], planeComparator);

A nakoniec ich otestujme:

assertThat (Arrays.deepEquals (roviny 1, roviny 2)). isTrue ();

Po prvom zoradení polí v rovnakom poradí povoľujeme deepEquals metóda na zistenie, či sú tieto dve polia rovnaké.

3. Záver

V tomto tutoriáli sme videli rôzne spôsoby porovnania polí. Po druhé, videli sme rozdiel medzi porovnaním referencií a hodnôt. Okrem toho sme sa pozreli na to, ako môžeme hlboko porovnať polia. Nakoniec sme videli rozdiel medzi normálnym a hlbokým porovnaním pomocou rovná sa a deepEquals, resp.

Úplný zdrojový kód príkladov je ako vždy k dispozícii na serveri GitHub.


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