Post by Michael PaapPost by Daniel RöderDie Frage ist, wer hat Recht?
Ich.
Kompiliere obiges Beispiel und schau dir mit javap -c <KLASSENNAME> an,
was im Bytecode steht. Danach schreibe eine Fehlermeldung an den Autor
des Buches. Ich hab das einmal gemacht, ich tu es nicht wieder.
Oder schau in die Langspec, Abschnitt 3.10.5 String Literals:
(http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#101083):
"Strings computed by constant expressions (§15.28) are computed at
compile time and then treated as if they were literals."
Nachtrag: Die Frage, um die es hier geht, ist nicht zu verwechseln mit
dem Problem, was der folgende Code demonstriert:
public class Stringverkettung {
public static void main(String[] args) {
long start;
long elapsed;
int amount;
amount = 20000;
start = System.currentTimeMillis();
test1(amount);
elapsed = System.currentTimeMillis() - start;
StringBuffer sb1 = new StringBuffer(50)
.append("Plus-Operator: \t")
.append(elapsed)
.append(" ms \t(")
.append(amount)
.append(" characters appended)");
System.out.println(sb1);
amount = 20000;
start = System.currentTimeMillis();
test2(amount);
elapsed = System.currentTimeMillis() - start;
StringBuffer sb2 = new StringBuffer(50)
.append("String#concat(): \t")
.append(elapsed)
.append(" ms \t(")
.append(amount)
.append(" characters appended)");
System.out.println(sb2);
amount = 1000000;
start = System.currentTimeMillis();
test3(amount);
elapsed = System.currentTimeMillis() - start;
StringBuffer sb3 = new StringBuffer(50)
.append("StringBuffer I: \t")
.append(elapsed)
.append(" ms \t(")
.append(amount)
.append(" characters appended)");
System.out.println(sb3);
amount = 1000000;
start = System.currentTimeMillis();
test4(amount);
elapsed = System.currentTimeMillis() - start;
StringBuffer sb4 = new StringBuffer(50)
.append("StringBuffer II: \t")
.append(elapsed)
.append(" ms \t(")
.append(amount)
.append(" characters appended)");
System.out.println(sb4);
amount = 1000000;
start = System.currentTimeMillis();
test5(amount);
elapsed = System.currentTimeMillis() - start;
StringBuffer sb5 = new StringBuffer(50)
.append("StringBuilder I: \t")
.append(elapsed)
.append(" ms \t(")
.append(amount)
.append(" characters appended)");
System.out.println(sb5);
amount = 1000000;
start = System.currentTimeMillis();
test6(amount);
elapsed = System.currentTimeMillis() - start;
StringBuffer sb6 = new StringBuffer(50)
.append("StringBuilder II: \t")
.append(elapsed)
.append(" ms \t(")
.append(amount)
.append(" characters appended)");
System.out.println(sb6);
}
/*
* Verkettung mit Plus-Operator
*/
static void test1(int amount) {
String s = "";
for (int i = 0; i < amount; i++) {
s = s + "x";
}
}
/*
* Verkettung mit String#concat()
*/
static void test2(int amount) {
String s = "";
for (int i = 0; i < amount; i++) {
s = s.concat("x");
}
}
/*
* Verkettung mit StringBuffer
*/
static void test3(int amount) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < amount; i++) {
sb.append("x");
}
String s = sb.toString();
}
/*
* Verkettung mit StringBuffer mit Laengenvorgabe
*/
static void test4(int amount) {
StringBuffer sb = new StringBuffer(amount);
for (int i = 0; i < amount; i++) {
sb.append("x");
}
String s = sb.toString();
}
/*
* Verkettung mit StringBuilder
*/
static void test5(int amount) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < amount; i++) {
sb.append("x");
}
String s = sb.toString();
}
/*
* Verkettung mit StringBuilder mit Laengenvorgabe
*/
static void test6(int amount) {
StringBuilder sb = new StringBuilder(amount);
for (int i = 0; i < amount; i++) {
sb.append("x");
}
String s = sb.toString();
}
}
Gruß,
Michael