Sammenligning av lange verdier i Java

1. Oversikt

I denne korte opplæringen diskuterer vi forskjellige måter å sammenligne to på Lang tilfeller. Vi legger vekt på problemene som oppstår når du bruker referansesammenligningsoperatøren (==).

2. Problem ved bruk av referansesammenligning

Lang er en innpakningsklasse for den primitive typen lang. Siden de er objekter og ikke primitive verdier, vi må sammenligne innholdet i Lang tilfeller bruker .er lik() i stedet for referansesammenligningsoperatøren (==).

I noen tilfeller kan vi få ideen om at == er greit, men utseende bedrar. Vurder at vi kan bruke == med lave tall:

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

men ikke med større tall. Vi vil ende opp med problemer hvis verdiene er utenfor området -128 til 127, å ha et helt annet og uventet resultat:

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

Dette er fordi Java har et konstant basseng for forekomster av Lang mellom -128 og 127.

Denne optimaliseringen gir oss imidlertid ikke lisens til å bruke ==. Generelt sett to forekomster med samme primitive verdi gir ikke den samme objektreferansen.

3. Bruke .er lik()

En av løsningene er å bruke .er lik(). Dette vil evaluere innholdet (og ikke referansen) til begge objektene:

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

4. Objects.equals ()

Problemet med å bruke er lik() er at vi må være forsiktige med å ikke kalle det på null henvisning.

Heldigvis er det en null-sikker verktøymetode vi kan bruke - Objects.equals ().

La oss se hvordan det fungerer i praksis:

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

Som vi kan se, trenger vi ikke å bry oss om noe av det Langs vi ønsker å sammenligne er null.

Under panseret, Objects.equals () bruker først == operatoren for sammenligningen, og hvis det mislykkes, bruker den en standard er lik().

5. Unboxing lange verdier

5.1. Bruker .longValue () Metode

La oss deretter bruke sammenligningsoperatøren “==”, men på en trygg måte. Klassen Nummer har en metode .longValue () som pakker ut det primitive lang verdi:

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

5.2. Casting til primitive verdier

En annen måte å unboxe a Lang er ved å kaste gjenstandene til primitive typer. Derfor trekker vi ut den primitive verdien, og deretter kan vi fortsette å bruke sammenligningsoperatoren:

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

Noter det, for .longValue () metode eller ved bruk av avstøpning, bør vi sjekke om objektet er null. Vi kan ha en NullPointerException hvis objektet er null.

6. Konklusjon

I denne korte opplæringen, vi har utforsket forskjellige alternativer for hvordan man kan sammenligne Lang gjenstander. Vi har analysert forskjellene når vi sammenligner referanser til objekter eller innhold.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found