long
Kurz: Ein primitiver Ganzzahltyp mit 64 Bit — für Werte, die den Wertebereich von int (ca. ±2,1 Milliarden) sprengen.
Genauer: Long-Literale brauchen ein L-Suffix, sonst interpretiert Java die Zahl zuerst als int und der Compiler meldet einen Fehler, wenn sie zu groß ist: long grosseZahl = 10000000000L;. Häufig genutzt für Zeitstempel (Millisekunden seit 1970) oder IDs in Datenbanken mit sehr vielen Einträgen.
Im Detail
long grosseZahl = 10000000000L; // ohne L-Suffix: Compiler-Fehler "integer number too large"
// Klassischer Fehler: Multiplikation von zwei ints überläuft VOR der Zuweisung zu long
int a = 100000, b = 100000;
long ergebnisFalsch = a * b; // int * int = int -> überläuft bereits! Falsches Ergebnis
long ergebnisRichtig = (long) a * b; // Cast VOR der Multiplikation erzwingt long-Arithmetik
long zeitstempel = System.currentTimeMillis(); // Millisekunden seit 1.1.1970 (Unix-Epoch)Der Multiplikations-Overflow-Fehler ist besonders tückisch, weil er sich nicht durch die Zieltyp-Deklaration (long ergebnisFalsch) verhindern lässt: Java berechnet a * b zunächst komplett als int-Ausdruck (da beide Operanden int sind), und ERST das fertige — bereits übergelaufene — Ergebnis wird anschließend in eine long-Variable “hochgecastet”. Der Cast muss deshalb VOR bzw. AUF einem der Operanden stehen, nicht erst bei der Zuweisung. System.currentTimeMillis() liefert grundsätzlich einen long-Wert zurück, weil die Anzahl der Millisekunden seit 1970 den Wertebereich von int längst gesprengt hat (das war historisch mit ein Auslöser für das “Jahr-2038-Problem” bei Systemen, die stattdessen Sekunden als 32-Bit-int speichern).
Long vs. Long (Wrapper-Klasse)
Neben dem primitiven long (klein geschrieben) gibt es die Wrapper-Klasse Long (groß geschrieben, ein echtes Objekt) — nötig überall dort, wo generische Collections wie List<Long> genutzt werden, da Generics ausschließlich mit Objekttypen arbeiten können, keine primitiven Typen direkt aufnehmen. Java wandelt zwischen beiden Formen meist automatisch um (Auto(un)boxing), was gelegentlich zu subtilen Performance-Fallen führt, wenn in einer Schleife viele solcher automatischen Umwandlungen anfallen.
long in der Praxis: IDs und Zeitstempel
Neben Zeitstempeln ist long auch der Standardtyp für Datenbank-Primärschlüssel (IDs) in Systemen mit potenziell sehr vielen Datensätzen — ein int-Primärschlüssel wäre bei über 2,1 Milliarden Einträgen erschöpft, was bei langlebigen, stark wachsenden Systemen durchaus real werden kann. Deshalb nutzen viele Frameworks und Datenbank-Schemata vorsorglich long/BIGINT für Primärschlüssel, selbst wenn die aktuelle Datenmenge das noch nicht ausreizt.
Siehe auch: byte, short, double, Wrapper Classes