Lange waarden in Java vergelijken

1. Overzicht

In deze korte tutorial bespreken we verschillende manieren om twee te vergelijken Lang gevallen. We benadrukken de problemen die zich voordoen bij het gebruik van de referentie-vergelijkingsoperator (==).

2. Probleem bij het gebruik van referentievergelijking

Lang is een wrapper-klasse voor het primitieve type lang. Omdat het objecten zijn en geen primitieve waarden, we moeten de inhoud van Lang instanties met .equals () in plaats van de referentie-vergelijkingsoperator (==).

In sommige gevallen kunnen we het idee krijgen dat == oké is, maar het uiterlijk bedriegt. Bedenk dat we == met lage getallen kunnen gebruiken:

Lang l1 = 127L; Lang l2 = 127L; assertThat (l1 == l2) .isTrue ();

maar niet met grotere aantallen. We zouden problemen krijgen als waarden buiten het bereik -128 tot 127 vallen, met een heel ander en onverwacht resultaat:

Lang l1 = 128L; Lang l2 = 128L; assertThat (l1 == l2) .isFalse ();

Dit is zo omdat Java onderhoudt een constante pool voor instanties van Lang tussen -128 en 127.

Deze optimalisatie geeft ons echter geen licentie om ==. In het algemeen twee omkaderde instanties met dezelfde primitieve waarde leveren niet dezelfde objectreferentie op.

3. Met behulp van .equals ()

Een van de oplossingen is om de .equals (). Dit zal de inhoud evalueren (en niet de referentie) van beide objecten:

Lang l1 = 128L; Lang l2 = 128L; assertThat (l1.equals (l2)). isTrue ();

4. Objects.equals ()

Het probleem met het gebruik van is gelijk aan () is dat we voorzichtig moeten zijn om het niet op de nul referentie.

Gelukkig is er een nul-veilige gebruiksmethode die we kunnen gebruiken - Objects.equals ().

Laten we eens kijken hoe het in de praktijk werkt:

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

Zoals we kunnen zien, hoeven we ons geen zorgen te maken als een van de Langs we willen vergelijken is nul.

Onder de motorkap, Objects.equals () gebruikt eerst de == operator voor de vergelijking, en als dat niet lukt, wordt een standaard gebruikt is gelijk aan ().

5. Unboxing lange waarden

5.1. De ... gebruiken .longValue () Methode

Laten we vervolgens de vergelijkingsoperator "==" gebruiken, maar op een veilige manier. De klas Aantal heeft een methode .longValue () die het primitieve uitpakt lang waarde:

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

5.2. Casting naar primitieve waarden

Een andere manier om een Lang is door de objecten naar primitieve typen te gieten. Daarom extraheren we de primitieve waarde en kunnen we doorgaan met het gebruik van de vergelijkingsoperator:

Lang l1 = 128L; Lang l2 = 128L; assertThat ((long) l1 == (long) l2) .isTrue ();

Let daar op, voor de .longValue () methode of met behulp van casten, moeten we controleren of het object is nul. We kunnen een NullPointerException als het object is nul.

6. Conclusie

In deze korte tutorial, we hebben verschillende opties onderzocht om te vergelijken Lang voorwerpen. We hebben de verschillen geanalyseerd bij het vergelijken van verwijzingen naar objecten of inhoud.

Zoals altijd is de volledige broncode van het artikel beschikbaar op GitHub.