Was ist der effizienteste Weg, um das erste Zeichen in String
Kleinbuchstaben zu schreiben?
Ich kann mir eine Reihe von Möglichkeiten vorstellen, dies zu tun:
Verwenden charAt()
mitsubstring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
Oder mit einem char
Array
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
Ich bin sicher, dass es viele andere großartige Möglichkeiten gibt, dies zu erreichen. Was empfehlen Sie?
c[0] |= ' ';
Antworten:
Ich habe die vielversprechenden Ansätze mit JMH getestet . Vollständiger Benchmark- Code .
Annahme während der Tests (um zu vermeiden, dass die Eckfälle jedes Mal überprüft werden): Die Länge der Eingabezeichenfolge ist immer größer als 1.
Ergebnisse
Die Punktzahl sind Operationen pro Sekunde, je mehr desto besser.
Tests
test1
war zuerst Andys und Hllinks Ansatz:test2
war zweiter Andys Ansatz. Es wird auchIntrospector.decapitalize()
von Daniel vorgeschlagen, aber ohne zweiif
Aussagen. Zuerstif
wurde wegen der Testannahme entfernt. Der zweite wurde entfernt, weil er die Korrektheit verletzte (dh die Eingabe"HI"
würde zurückkehren"HI"
). Dies war fast der schnellste.test3
war eine Modifikation vontest2
, aber stattdessen habeCharacter.toLowerCase()
ich 32 hinzugefügt, was genau dann richtig funktioniert, wenn die Zeichenfolge in ASCII ist. Dies war der schnellste.c[0] |= ' '
aus Mikes Kommentar ergab die gleiche Leistung.test4
gebrauchtStringBuilder
.test5
benutzte zweisubstring()
Anrufe.test6
verwendet Reflektion, umchar value[]
direkt in String zu ändern . Dies war der langsamste.Schlussfolgerungen
Wenn die Zeichenfolgenlänge immer größer als 0 ist, verwenden Sie
test2
.Wenn nicht, müssen wir die Eckfälle überprüfen:
Wenn Sie sicher sind, dass Ihr Text immer in ASCII vorliegt und Sie nach extremer Leistung suchen, weil Sie diesen Code im Engpass gefunden haben, verwenden Sie
test3
.quelle
Ich bin auf eine nette Alternative gestoßen, wenn Sie keine Bibliothek eines Drittanbieters verwenden möchten:
quelle
Wenn es um die Manipulation von Strings geht, werfen Sie einen Blick auf Jakarta Commons Lang StringUtils .
quelle
Wenn Sie Apache Commons verwenden möchten, können Sie Folgendes tun:
Ergebnis: someString
quelle
compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'
Trotz eines char-orientierten Ansatzes würde ich eine String-orientierte Lösung vorschlagen. String.toLowerCase ist länderspezifisch, daher würde ich dieses Problem berücksichtigen.
String.toLowerCase
ist für Kleinbuchstaben nach Character.toLowerCase zu bevorzugen . Eine char-orientierte Lösung ist auch nicht vollständig Unicode-kompatibel, da Character.toLowerCase keine zusätzlichen Zeichen verarbeiten kann.UPDATE: Als Beispiel, wie wichtig die Ländereinstellung ist, lassen Sie uns
I
in Türkisch und Deutsch Kleinbuchstaben schreiben:gibt zwei verschiedene Ergebnisse aus:
quelle
Zeichenfolgen in Java sind unveränderlich, sodass in beiden Fällen eine neue Zeichenfolge erstellt wird.
Ihr erstes Beispiel wird wahrscheinlich etwas effizienter sein, da nur eine neue Zeichenfolge und kein temporäres Zeichenarray erstellt werden muss.
quelle
Eine sehr kurze und einfache statische Methode, um zu archivieren, was Sie wollen:
quelle
Wenn das, was Sie benötigen, sehr einfach ist (z. B. Java-Klassennamen, keine Gebietsschemas), können Sie auch die CaseFormat- Klasse in der Google Guava- Bibliothek verwenden.
Oder Sie können ein Konverterobjekt vorbereiten und wiederverwenden, was effizienter sein könnte.
Weitere Informationen zur Philosophie der Google Guava-Zeichenfolgenmanipulation finden Sie auf dieser Wiki-Seite .
quelle
quelle
Ich bin erst heute darauf gestoßen. Versucht, es selbst auf die fußgängerfreundlichste Weise zu tun. Das dauerte eine Zeile, obwohl es länger dauerte. Hier geht
Gibt:
Vor str = TaxoRanks
Nach str = taxoRanks
quelle
Ergebnis:
quelle