Hosszú értékek összehasonlítása a Java-ban

1. Áttekintés

Ebben a rövid bemutatóban a kettő összehasonlításának különböző módjait fogjuk megvitatni Hosszú példányok. Hangsúlyozzuk a referencia-összehasonlító operátor használatakor felmerülő problémákat (==).

2. Probléma a referencia-összehasonlítás használatával

Hosszú a primitív típus burkoló osztálya hosszú. Mivel objektumok és nem primitív értékek, össze kell hasonlítanunk a tartalmát Hosszú példányokat használ .egyenlő () a referencia-összehasonlító operátor (==) helyett.

Bizonyos esetekben felmerülhet bennünk az a gondolat, hogy a == rendben van, de a küllem csal. Vegye figyelembe, hogy alacsony számokkal használhatjuk a == értéket:

Hosszú l1 = 127L; Hosszú l2 = 127L; assertThat (l1 == l2) .isTrue ();

de nem nagyobb számmal. Végül problémáink lennének ha az értékek a -128 és 127 közötti tartományon kívül esnek, amelynek teljesen más és váratlan eredménye van:

Hosszú l1 = 128L; Hosszú l2 = 128L; assertThat (l1 == l2) .isFalse ();

Ez azért van, mert A Java állandó készletet tart fenn a Hosszú -128 és 127 között.

Ez az optimalizálás azonban nem ad engedélyt a == használatára. Általános esetben két azonos primitív értékű dobozos példány nem adja meg ugyanazt az objektum hivatkozást.

3. Használata .egyenlő ()

Az egyik megoldás a .egyenlő (). Ez kiértékeli a tartalmat (és nem a referencia) mindkét objektumról:

Hosszú l1 = 128L; Hosszú l2 = 128L; assertThat (l1.egyenlő (l2)). isTrue ();

4. Objects.equals ()

A használat problémája egyenlő () az, hogy óvatosnak kell lennünk, hogy ne hívjuk fel a nulla referencia.

Szerencsére van egy nulla-biztonsági segédprogram, amelyet használhatunk - Objektumok.egyenlő ().

Nézzük meg, hogyan működik a gyakorlatban:

Hosszú l1 = null; Hosszú l2 = 128L; assertThatCode (() -> Objects.equals (l1, l2)). doesNotThrowAnyException ();

Mint láthatjuk, nem kell bajlódnunk, ha bármelyik Hosszús szeretnénk összehasonlítani az nulla.

A motorháztető alatt, Objects.equals () először az == operátort használja az összehasonlításhoz, és ha ez nem sikerül, akkor egy szabványt használ egyenlő ().

5. Hosszú értékek kibontása

5.1. Használni a .longValue () Módszer

Ezután használjuk a „==” összehasonlító operátort, de biztonságos módon. Osztály Szám van egy módszere .longValue () amely kibontja a primitívet hosszú érték:

Hosszú l1 = 128L; Hosszú l2 = 128L; assertThat (l1.longValue () == l2.longValue ()). isTrue ();

5.2. Casting a primitív értékekhez

A doboz kibontásának egy másik módja a Hosszú az, hogy a tárgyakat primitív típusokba öntjük. Ezért kinyerjük a primitív értéket, majd folytathatjuk az összehasonlító operátor használatát:

Hosszú l1 = 128L; Hosszú l2 = 128L; assertThat ((hosszú) l1 == (hosszú) l2) .isTrue ();

Vegye figyelembe, hogy, a .longValue () módszerrel vagy öntéssel, ellenőriznünk kell, hogy az objektum-e nulla. Van egy NullPointerException ha az objektum az nulla.

6. Következtetés

Ebben a rövid bemutatóban különböző lehetőségeket tártunk fel az összehasonlítás módjára Hosszú tárgyakat. Elemeztük a különbségeket, amikor összehasonlítottuk az objektumokra vagy a tartalomra való hivatkozásokat.

Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.