Vergleichen langer Werte in Java

1. Übersicht

In diesem kurzen Tutorial werden verschiedene Möglichkeiten zum Vergleichen von zwei langen Instanzen erläutert. Wir betonen die Probleme, die bei der Verwendung des Referenzvergleichsoperators ( == ) auftreten.

2. Problem beim Referenzvergleich

Long ist eine Wrapper-Klasse für den primitiven Typ long . Da es sich um Objekte und nicht um primitive Werte handelt, müssen wir den Inhalt von Long- Instanzen mit .equals () anstelle des Referenzvergleichsoperators (==) vergleichen.

In einigen Fällen kommen wir vielleicht auf die Idee, dass == in Ordnung ist, aber das Aussehen täuscht. Bedenken Sie, dass wir == mit niedrigen Zahlen verwenden können:

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

aber nicht mit größeren Zahlen. Wir würden Probleme haben, wenn die Werte außerhalb des Bereichs von -128 bis 127 liegen und ein völlig anderes und unerwartetes Ergebnis haben:

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

Dies liegt daran, dass Java einen konstanten Pool für Long- Instanzen zwischen -128 und 127 verwaltet.

Diese Optimierung gibt uns jedoch keine Lizenz zur Verwendung von ==. Im allgemeinen Fall ergeben zwei Boxed-Instanzen mit demselben Grundwert nicht dieselbe Objektreferenz.

3. Verwenden von .equals ()

Eine der Lösungen ist die Verwendung von .equals () . Dadurch wird der Inhalt (und nicht die Referenz) beider Objekte bewertet :

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

4. Objects.equals ()

Das Problem bei der Verwendung von equals () ist, dass wir vorsichtig sein müssen, um es nicht in der Nullreferenz aufzurufen .

Glücklicherweise gibt es eine null- sichere Dienstprogrammmethode, die wir verwenden können - Objects.equals ().

Mal sehen, wie es in der Praxis funktioniert:

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

Wie wir sehen können, müssen wir uns nicht darum kümmern, ob einer der Longs, die wir vergleichen möchten, null ist.

Unter der Haube verwendet Objects.equals () zuerst den Operator == für den Vergleich, und wenn dies fehlschlägt, wird ein Standard equals () verwendet.

5. Lange Werte entpacken

5.1. Unter Verwendung des .longValue () Methode

Als nächstes verwenden wir den Vergleichsoperator "==", jedoch auf sichere Weise. Die Klasse Nummer verfügt über eine Methode .longValue () , die den primitiven auspackt langen Wertes:

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

5.2. Casting auf primitive Werte

Eine andere Möglichkeit, ein Long zu entpacken, besteht darin, die Objekte in primitive Typen umzuwandeln. Daher extrahieren wir den primitiven Wert und können dann den Vergleichsoperator verwenden:

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

Beachten Sie, dass wir für die .longValue () -Methode oder die Verwendung von Casting prüfen sollten, ob das Objekt null ist . Wir könnten eine NullPointerException haben, wenn das Objekt null ist .

6. Fazit

In diesem kurzen Tutorial haben wir verschiedene Optionen zum Vergleichen langer Objekte untersucht. Wir haben die Unterschiede beim Vergleich von Verweisen auf Objekte oder Inhalte analysiert.

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.