Ich versuche, Zeichenfolgen in Java zu verketten. Warum funktioniert das nicht?
public class StackOverflowTest {
public static void main(String args[]) {
int theNumber = 42;
System.out.println("Your number is " . theNumber . "!");
}
}
Sie können Strings mit der verketten +
Operator:
System.out.println("Your number is " + theNumber + "!");
theNumber
wird implizit in den String konvertiert "42"
.
Der Verkettungsoperator in Java ist +
nicht .
Lesen Sie dies (einschließlich aller Unterabschnitte), bevor Sie beginnen. Versuchen Sie aufzuhören, auf PHP-Weise zu denken 😉
Um Ihren Blick auf die Verwendung von Strings in Java zu erweitern – die +
-Operator für Zeichenfolgen wird tatsächlich (vom Compiler) in etwas Ähnliches umgewandelt wie:
new StringBuilder().append("firstString").append("secondString").toString()
Auf diese Frage gibt es zwei grundsätzliche Antworten:
- [simple] Verwenden Sie die
+
Operator (String-Verkettung). "your number is" + theNumber + "!"
(wie an anderer Stelle angemerkt)
- [less simple]: Verwenden
StringBuilder
(oder StringBuffer
).
StringBuilder value;
value.append("your number is");
value.append(theNumber);
value.append("!");
value.toString();
Ich rate davon ab, Operationen wie diese zu stapeln:
new StringBuilder().append("I").append("like to write").append("confusing code");
Bearbeiten: Ab Java 5 wird der String-Verkettungsoperator übersetzt StringBuilder
Aufrufe durch den Compiler. Aus diesem Grund sind beide oben genannten Methoden gleich.
Merke: Raum ist ein kostbares Gut, wie dieser Satz zeigt.
Vorbehalt: Beispiel 1 unten generiert mehrere StringBuilder
Instanzen und ist weniger effizient als Beispiel 2 unten
Beispiel 1
String Blam = one + two;
Blam += three + four;
Blam += five + six;
Beispiel 2
String Blam = one + two + three + four + five + six;
Out of the Box haben Sie 3 Wege den Wert einer Variablen in a einfügen String
wie Sie versuchen, Folgendes zu erreichen:
1. Der einfachste Weg
Sie können einfach den Operator verwenden +
zwischen a String
und jedes Objekt oder jeden primitiven Typ, wird es automatisch verkettet String
und
- Im Falle eines Objekts der Wert von
String.valueOf(obj)
Entsprechend der String
“null
” wenn obj
ist null
andernfalls der Wert von obj.toString()
.
- Im Falle eines primitiven Typs das Äquivalent von
String.valueOf(<primitive-type>)
.
Beispiel mit einem non null
Objekt:
Integer theNumber = 42;
System.out.println("Your number is " + theNumber + "!");
Ausgabe:
Your number is 42!
Beispiel mit a null
Objekt:
Integer theNumber = null;
System.out.println("Your number is " + theNumber + "!");
Ausgabe:
Your number is null!
Beispiel mit einem primitiven Typ:
int theNumber = 42;
System.out.println("Your number is " + theNumber + "!");
Ausgabe:
Your number is 42!
2. Der explizite Weg und möglicherweise der effizienteste
Sie können verwenden StringBuilder
(oder StringBuffer
das Thread-sichere veraltete Gegenstück), um Ihre zu erstellen String
Verwendung der append
Methoden.
Beispiel:
int theNumber = 42;
StringBuilder buffer = new StringBuilder()
.append("Your number is ").append(theNumber).append('!');
System.out.println(buffer.toString()); // or simply System.out.println(buffer)
Ausgabe:
Your number is 42!
Hinter den Kulissen konvertieren aktuelle Java-Compiler auf diese Weise alle String
Verkettungen mit dem Operator +
der einzige Unterschied zum vorherigen Weg besteht darin, dass Sie die haben volle Kontrolle.
In der Tat werden die Compiler die verwenden Standardkonstruktor also die Standardkapazität (16
), da sie keine Ahnung haben, was die endgültige Länge der wäre String
zu bauen, was bedeutet, dass wenn die endgültige Länge größer ist als 16
die Kapazität wird notwendigerweise erweitert, was einen Preis in Bezug auf die Leistungen hat.
Also, wenn Sie im Voraus wissen, dass die Größe Ihres endgültigen String
wird größer sein als 16
, ist es viel effizienter, diesen Ansatz zu verwenden, um eine bessere Anfangskapazität bereitzustellen. In unserem Beispiel erstellen wir beispielsweise a String
dessen Länge größer als 16 ist, sollte es für eine bessere Leistung wie folgt umgeschrieben werden:
Beispiel optimiert:
int theNumber = 42;
StringBuilder buffer = new StringBuilder(18)
.append("Your number is ").append(theNumber).append('!');
System.out.println(buffer)
Ausgabe:
Your number is 42!
3. Der am besten lesbare Weg
Sie können die Methoden verwenden String.format(locale, format, args)
oder String.format(format, args)
dass beide auf a angewiesen sind Formatter
um deine zu bauen String
. Auf diese Weise können Sie das Format Ihres Finales festlegen String
durch die Verwendung von Platzhaltern, die durch den Wert der Argumente ersetzt werden.
Beispiel:
int theNumber = 42;
System.out.println(String.format("Your number is %d!", theNumber));
// Or if we need to print only we can use printf
System.out.printf("Your number is still %d with printf!%n", theNumber);
Ausgabe:
Your number is 42!
Your number is still 42 with printf!
Der interessanteste Aspekt bei diesem Ansatz ist die Tatsache, dass wir eine klare Vorstellung davon haben, was das Finale sein wird String
weil es viel einfacher zu lesen ist, also ist es viel einfacher zu warten.
Der Java-8-Weg:
StringJoiner sj1 = new StringJoiner(", ");
String joined = sj1.add("one").add("two").toString();
// one, two
System.out.println(joined);
StringJoiner sj2 = new StringJoiner(", ","{", "}");
String joined2 = sj2.add("Jake").add("John").add("Carl").toString();
// {Jake, John, Carl}
System.out.println(joined2);
Sie müssen ein PHP-Programmierer sein.
Benutze einen +
Schild.
System.out.println("Your number is " + theNumber + "!");