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.