Sammenligning af lange værdier i Java

1. Oversigt

I denne korte vejledning diskuterer vi forskellige måder at sammenligne to på Lang tilfælde. Vi understreger de problemer, der opstår, når der bruges operatoren til sammenligning af reference (==).

2. Problem ved brug af referencesammenligning

Lang er en indpakningsklasse for den primitive type lang. Da de er objekter og ikke primitive værdier, vi er nødt til at sammenligne indholdet af Lang tilfælde, der bruger .lige med() i stedet for reference sammenligningsoperatøren (==).

I nogle tilfælde kan vi få ideen om, at == er okay, men udseende bedrager. Overvej at vi kan bruge == med lave tal:

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

men ikke med større antal. Vi ender med at have problemer hvis værdier er uden for området -128 til 127, har et helt andet og uventet resultat:

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

Dette er fordi Java opretholder en konstant pulje til forekomster af Lang mellem -128 og 127.

Denne optimering giver os dog ikke en licens til at bruge ==. I det generelle tilfælde to forekomster i boks med samme primitive værdi giver ikke den samme objektreference.

3. Brug .lige med()

En af løsningerne er at bruge .lige med(). Dette vil evaluere indholdet (og ikke referencen) for begge objekter:

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

4. Objects.equals ()

Problemet med at bruge lige med() er, at vi skal være forsigtige med ikke at kalde det på nul reference.

Heldigvis er der en nul-sikker hjælpemetode, vi kan bruge - Objects.equals ().

Lad os se, hvordan det fungerer i praksis:

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

Som vi kan se, behøver vi ikke gider, hvis noget af det Langs vi ønsker at sammenligne er nul.

Under kølerhjelmen, Objects.equals () bruger først == operatoren til sammenligningen, og hvis det mislykkes, bruger den en standard lige med().

5. Unboxing lange værdier

5.1. Bruger .longValue () Metode

Lad os derefter bruge “==” sammenligningsoperatøren, men på en sikker måde. Klassen Nummer har en metode .longValue () som pakker det primitive ud lang værdi:

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

5.2. Casting til primitive værdier

En anden måde at afkasse en Lang er ved at kaste objekterne til primitive typer. Derfor udtrækker vi den primitive værdi, og så kan vi fortsætte med at bruge sammenligningsoperatoren:

Lang l1 = 128L; Lang l2 = 128L; hævder, at ((lang) l1 == (lang) l2). er sand ();

Noter det, til .longValue () metode eller ved hjælp af støbning, skal vi kontrollere, om objektet er nul. Vi kunne have en NullPointerException hvis genstanden er nul.

6. Konklusion

I denne korte vejledning vi har undersøgt forskellige muligheder for at sammenligne Lang genstande. Vi har analyseret forskellene, når vi sammenligner referencer til objekter eller indhold.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.