Porovnanie dlhých hodnôt v Jave

1. Prehľad

V tomto krátkom tutoriáli si rozoberieme rôzne spôsoby porovnania dvoch Dlhé inštancie. Zdôrazňujeme problémy, ktoré vznikajú pri použití operátora porovnávania referencií (==).

2. Problém s použitím referenčného porovnania

Dlhé je trieda obalov pre primitívny typ dlho. Pretože sú to objekty a nie primitívne hodnoty, musíme porovnať obsah Dlhé inštancie pomocou .equals () namiesto operátora porovnávania referencií (==).

V niektorých prípadoch môžeme získať predstavu, že == je v poriadku, ale vzhľad klame. Zvážte, že môžeme použiť == s nízkym počtom:

Dlhé 11 = 127 L; Dlhé l2 = 127 L; assertThat (l1 == l2) .isTrue ();

ale nie s väčším počtom. Skončili by sme s problémami ak sú hodnoty mimo rozsah -128 až 127, s úplne iným a neočakávaným výsledkom:

Dlhé 11 = 128 L; Dlhé l2 = 128 L; assertThat (l1 == l2) .isFalse ();

To je preto, že Java udržiava stály fond pre inštancie Dlhé medzi -128 a 127.

Táto optimalizácia nám však nedáva licenciu na použitie ==. Vo všeobecnom prípade dve škatuľkové inštancie, ktoré majú rovnakú primitívnu hodnotu, neprinášajú rovnaký odkaz na objekt.

3. Používanie .equals ()

Jedným z riešení je použitie .equals (). Týmto sa vyhodnotí obsah (a nie odkaz) oboch objektov:

Dlhé 11 = 128 L; Dlhé l2 = 128 L; assertThat (l1.equals (l2)). isTrue ();

4. Objects.equals ()

Problém s používaním rovná sa () je, že musíme byť opatrní, aby sme to nezvolávali na nulový odkaz.

Našťastie existuje nulový- bezpečnú metódu, ktorú môžeme použiť - Objects.equals ().

Pozrime sa, ako to funguje v praxi:

Long l1 = null; Dlhé l2 = 128 L; assertThatCode (() -> Objects.equals (l1, l2)). doesNotThrowAnyException ();

Ako vidíme, nemusíme sa obťažovať, ak niečo z Dlhés, ktoré chceme porovnať, je nulový.

Pod kapotou, Objects.equals () najskôr použije na porovnanie operátor ==, a ak zlyhá, použije štandard rovná sa ().

5. Unboxing Long Values

5.1. Pomocou .longValue () Metóda

Ďalej použijeme operátor porovnania „==“, ale bezpečným spôsobom. Trieda Číslo má metódu .longValue () ktorý rozbalí primitívu dlho hodnota:

Dlhé 11 = 128 L; Dlhé l2 = 128 L; assertThat (l1.longValue () == l2.longValue ()). isTrue ();

5.2. Casting na primitívne hodnoty

Iný spôsob rozbalenia a Dlhé je odliatím objektov do primitívnych typov. Preto extrahujeme primitívnu hodnotu a potom môžeme pokračovať v použití operátora porovnania:

Dlhé 11 = 128 L; Dlhé l2 = 128 L; assertThat ((long) l1 == (long) l2) .isTrue ();

Poznač si to, pre .longValue () metódou alebo pomocou odlievania by sme mali skontrolovať, či je objekt nulový. Mohli by sme mať NullPointerException ak je objekt nulový.

6. Záver

V tomto krátkom návode preskúmali sme rôzne možnosti porovnania Dlhé predmety. Analyzovali sme rozdiely pri porovnávaní odkazov na objekty alebo obsah.

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