Führende Nullen in Java: Vom Anfänger zum Profi mit Leistungsmessung
\n\nJeder Java-Entwickler steht früher oder später vor der Aufgabe: „Wie füge ich einer Zahl links Nullen hinzu?“. Scheinbar eine triviale Operation – die Zahl 42 nehmen und in „000042“ verwandeln. Aber sobald man anfängt zu googeln, stößt man auf Dutzende von Methoden: String.format, DecimalFormat, StringBuilder, manuelle Schleifen und sogar String.repeat (Java 11+).
Die Frage „How can I pad an integer with zeros on the left?“ auf Stack Overflow hat Tausende von Aufrufen gesammelt. Und das ist kein Zufall. Hinter der einfachen Aktion verbirgt sich eine ganze Reihe von Dilemmata: Welche Methode ist schneller? Welche ist lesbarer? Welche tötet nicht die Leistung in einer hochbelasteten Anwendung?
\n\nIn diesem Artikel zeigen wir nicht nur Code. Wir führen eine eigene kleine Untersuchung durch, messen die Geschwindigkeit jedes Ansatzes und geben klare Empfehlungen. Sie erfahren, wann Sie Mikrosekunden für Eleganz opfern können und wann es besser ist, „schmutzigen“, aber blitzschnellen Code zu schreiben.
\n\nWarum ist das wichtig? Leistungskontext
\n\nAngenommen, Sie generieren Millionen von String-Identifikatoren in einem ETL-Prozess, erstellen Bestellnummern oder serialisieren Daten für Logs. Jede zusätzliche Nanosekunde für Padding Nullen multipliziert sich mit der Anzahl der Operationen. Der Unterschied zwischen dem „schönen“ String.format und dem manuellen StringBuilder kann hunderte Prozent betragen.
Aber beeilen Sie sich nicht, alles zu optimieren. Wie Donald Knuth sagte: „Vorzeitige Optimierung ist die Wurzel allen Übels.“ Zuerst verstehen wir die Werkzeuge und entscheiden dann, welches wir wählen.
\n\nMethode 1: String.format() – König der Lesbarkeit
\n\nDie beliebteste und intuitivste Variante. Die Methode String.format() verwendet den Formatbezeichner %0Nd, wobei N die Gesamtlänge des resultierenden Strings ist.
int number = 42;\nString padded = String.format("%06d", number); // "000042"\nSystem.out.println(padded);\n\nDie Vorteile liegen auf der Hand: Der Code liest sich wie normaler Text, man muss nicht über Randfälle nachdenken. Der Nachteil ist die Leistung. String.format erstellt intern einen Formatter und analysiert den Formatstring bei jedem Aufruf. Für einmalige Operationen ideal, für eine Schleife mit 10 Millionen Iterationen fragwürdig.
Methode 2: DecimalFormat – Erbe von Währungsformaten
\n\nDie Klasse DecimalFormat aus dem Paket java.text wurde ursprünglich für die Formatierung von Währungen und Prozenten entwickelt, eignet sich aber hervorragend für führende Nullen.
import java.text.DecimalFormat;\n\nDecimalFormat df = new DecimalFormat("000000");\nString padded = df.format(42); // "000042"\n\nDie Hauptnuance: DecimalFormat ist nicht threadsicher. Wenn Sie es in einer Multithread-Umgebung verwenden, müssen Sie entweder synchronisieren oder bei jedem Aufruf eine neue Instanz erstellen (was die Leistung beeinträchtigt).
Methode 3: StringBuilder + manuelle Berechnung – Hardcore
\n\nFür diejenigen, die keine Angst haben, ein paar zusätzliche Zeilen für Geschwindigkeit zu schreiben. Wir erstellen ein Zeichen-Array mit der gewünschten Länge, füllen es mit Nullen und kopieren dann die Ziffern der Zahl von hinten.
\n\npublic static String padLeftZeros(int number, int totalLength) {\n char[] result = new char[totalLength];\n for (int i = 0; i < totalLength; i++) {\n result[i] = '0';\n }\n int index = totalLength - 1;\n while (number > 0 && index >= 0) {\n result[index--] = (char) ('0' + (number % 10));\n number /= 10;\n }\n return new String(result);\n}\n\n// Verwendung:\nString padded = padLeftZeros(42, 6); // "000042"\n\nDiese Methode ist um ein Vielfaches schneller als String.format, erfordert aber Sorgfalt: Negative Zahlen müssen behandelt werden (wir betrachten sie der Einfachheit halber nicht) und der Fall, dass die Zahl länger als die angegebene Länge ist.