Usporedba dugih vrijednosti u Javi

1. Pregled

U ovom kratkom vodiču razgovarat ćemo o različitim načinima usporedbe dvaju Dugo instance. Naglašavamo probleme koji se javljaju kada se koristi referentni operator usporedbe (==).

2. Problem korištenja referentne usporedbe

Dugo je klasa omota za primitivni tip dugo. Budući da su objekti, a ne primitivne vrijednosti, moramo usporediti sadržaj Dugo instanci pomoću .equals () umjesto operatora usporedbe referenci (==).

U nekim slučajevima možemo dobiti ideju da je == u redu, ali izgled vara. Uzmite u obzir da == možemo koristiti s malim brojevima:

Dugački l1 = 127L; Dugački l2 = 127L; assertThat (l1 == l2) .isTrue ();

ali ne i s većim brojevima. Na kraju bismo imali problema ako su vrijednosti izvan raspona -128 do 127, koji imaju potpuno drugačiji i neočekivani rezultat:

Dugački l1 = 128L; Dugački l2 = 128L; assertThat (l1 == l2) .isFalse ();

Ovo je zbog Java održava konstantno spremište za instance Dugo između -128 i 127.

Ova nam optimizacija, međutim, ne daje licencu za upotrebu ==. U općenitom slučaju, dvije uokvirene instance koje imaju istu primitivnu vrijednost ne daju istu referencu objekta.

3. Korištenje .equals ()

Jedno od rješenja je korištenje .equals (). Ovo će procijeniti sadržaj (a ne referenca) oba objekta:

Dugački l1 = 128L; Dugački l2 = 128L; assertThat (l1.equals (l2)). isTrue ();

4. Objects.equals ()

Problem s korištenjem jednako () je da trebamo biti oprezni da ga ne bismo pozvali na null referenca.

Srećom, postoji null-sigurna korisna metoda koju možemo koristiti - Objekti.equals ().

Pogledajmo kako to funkcionira u praksi:

Long l1 = null; Dugački l2 = 128L; assertThatCode (() -> Objects.equals (l1, l2)). doesNotThrowAnyException ();

Kao što vidimo, ne trebamo se mučiti ako je išta od toga Dugos želimo usporediti je null.

Ispod haube, Objects.equals () prvo koristi operator == za usporedbu, a ako to ne uspije koristi standard jednako ().

5. Raspakiranje dugih vrijednosti

5.1. Koristiti .longValue () Metoda

Dalje, upotrijebimo operator usporedbe “==”, ali na siguran način. Razred Broj ima metodu .longValue () koja odmotava primitiv dugo vrijednost:

Dugački l1 = 128L; Dugački l2 = 128L; assertThat (l1.longValue () == l2.longValue ()). isTee ();

5.2. Lijevanje na primitivne vrijednosti

Drugačiji način raspakiranja a Dugo je lijevanjem predmeta na primitivne tipove. Stoga ćemo izdvojiti primitivnu vrijednost, a zatim možemo nastaviti koristiti operater usporedbe:

Dugački l1 = 128L; Dugački l2 = 128L; assertThat ((long) l1 == (long) l2) .isTrue ();

Imajte na umu da, za .longValue () metodom ili pomoću lijevanja, trebali bismo provjeriti je li objekt null. Mogli bismo imati NullPointerException ako je objekt null.

6. Zaključak

U ovom kratkom vodiču, istražili smo različite mogućnosti kako usporediti Dugo predmeta. Analizirali smo razlike kada uspoređujemo reference na predmete ili sadržaj.

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