HOWTO · Java

Unterschied zwischen den primitiven Java-Typen long und int

Dieser Artikel vergleicht die Java-Datentypen long und int und erklärt ihre Wertebereiche sowie den passenden Einsatz.

Auf dieser Seite

Verwende int, wenn die erwarteten Werte in dessen Wertebereich liegen; wähle long, wenn sie größer sein können. Beide sind vorzeichenbehaftete primitive Ganzzahltypen. Ihre Wrapper-Klassen Integer und Long sind Objekte für APIs und Collections, die Referenztypen voraussetzen. In den folgenden Abschnitten werden Wertebereiche, Literalsyntax und sinnvolle Einsatzfälle für Wrapper verglichen.

Java: int oder long wählen

Ein int ist 32 Bit breit und kann Werte von -2,147,483,648 bis einschließlich 2,147,483,647 darstellen. Ein long ist 64 Bit breit und kann Werte von -9,223,372,036,854,775,808 bis einschließlich 9,223,372,036,854,775,807 darstellen. Entscheide anhand des erwarteten Wertebereichs deiner Daten; allein der Typname garantiert nicht, dass jedes Rechenergebnis hineinpasst.

Typ Breite Minimum Maximum
int 32 Bit -2,147,483,648 2,147,483,647
long 64 Bit -9,223,372,036,854,775,808 9,223,372,036,854,775,807

Ein dezimales Ganzzahlliteral ohne Suffix erhält normalerweise den Typ int, sofern sein Wert in dessen Bereich liegt. Füge L hinzu, um ein Literal als long zu kennzeichnen, besonders wenn sein Wert außerhalb des int-Bereichs liegt. Verwende vorzugsweise ein großes L, damit es sich leichter von der Ziffer 1 unterscheiden lässt. Zum Beispiel ist long population = 9_000_000_000L; ein gültiges long-Literal. Die Unterstriche verbessern die Lesbarkeit und ändern den Wert nicht.

Führe dieses Beispiel aus, um einen int-Wert mit einem long-Wert zu vergleichen. Die sichtbaren Beschriftungen im unveränderten Beispiel bleiben auf Englisch:

public class IntVsLongExample {
    public static void main(String[] args) {
        int count = 120;
        long total = 9_000_000_000L;
        System.out.println("count: " + count);
        System.out.println("total: " + total);
    }
}
count: 120
total: 9000000000

Beim Vergleich zur Compilezeit wird int tooLarge = 2147483648; nicht kompiliert: Das dezimale Literal passt nicht in int und ist nicht als long gekennzeichnet. Verwende stattdessen long value = 2147483648L;. Der Compiler weist die erste Deklaration zurück, bevor das Programm ausgeführt wird; daher gibt es dafür keine Laufzeitausgabe. Beachte außerdem: Ein int-Ausdruck wird als int berechnet, sofern nicht ein Operand oder eine Umwandlung die Rechnung zu long macht. Wird ein bereits übergelaufenes Ergebnis einer long-Variablen zugewiesen, lässt sich der verlorene Wert dadurch nicht wiederherstellen.

Die Wrapper-Klassen Integer und Long verwenden

Integer umschließt einen int, und Long umschließt einen long. Java kann zwischen einem primitiven Wert und seinem Wrapper durch Autoboxing und Unboxing umwandeln. Zum Beispiel verpackt Integer score = 42; den primitiven Wert automatisch in ein Objekt, während int recordedScore = score; ihn wieder entpackt. Auch die expliziten Methoden intValue() und longValue() sind verfügbar; sie können die Umwandlung deutlicher machen und so die Lesbarkeit verbessern.

Wrapper sind nützlich, wenn eine API Objekte voraussetzt. Generische Collections wie List<Integer> können beispielsweise keinen primitiven Typ als Typargument verwenden; Werte, die in dieser Liste abgelegt werden, werden daher verpackt. Verwende Long für die Objektdarstellung eines long, etwa in List<Long>. Für gewöhnliche lokale Berechnungen sind primitive Typen meist einfacher. Wrapper-Klassen sind nicht allein deshalb nötig, um eine Umwandlungs- oder Hilfsmethode aufzurufen.

Der Wertebereich bleibt unverändert: Ein Integer enthält einen int-Wert und ein Long einen long-Wert. Ein Wrapper kann keine Zahl darstellen, die außerhalb des Bereichs seines zugrunde liegenden primitiven Typs liegt. Verwende das Suffix L für ein long-Literal, unabhängig davon, ob du es einer long-Variablen zuweist oder in ein Long-Objekt verpackst.

Unterschiede zwischen primitiven Typen und Wrapper-Objekten

Eine primitive Variable speichert einen Wert ihres primitiven Typs. Eine Wrapper-Variable enthält entweder eine Referenz auf ein Wrapper-Objekt oder null. Das ist der entscheidende Unterschied für die Programmierung; Wrapper lediglich als Zeiger auf numerischen Speicher zu beschreiben, ist ein ungenaues physisches Speichermodell und hilft nicht bei der Typwahl.

Primitive Typen können nicht null sein. Eine Referenz wie Integer optionalCount = null; kann das Fehlen eines Werts ausdrücken. Das ist nützlich, wenn eine API oder ein Datenmodell zwischen „nicht angegeben“ und dem Zahlenwert null unterscheiden muss. In diesem Fall muss die Referenz vor der Verwendung auf null geprüft werden. Entpackt Java ein null-Integer oder ein null-Long, löst der Vorgang eine NullPointerException aus. Entpacke den Wrapper daher erst, wenn feststeht, dass die Referenz auf ein Objekt verweist.

Kurz gesagt: Wähle int oder long passend zum benötigten Zahlenbereich und verwende Integer oder Long, wenn objektbasierte APIs, Collections oder nullable Werte Wrapper erfordern. So bleiben Berechnungen und die Darstellung fehlender Werte klar voneinander getrennt.