StringBuffer
Annyira közhely számba megy, hogy most már muszáj itt is szerepeltetnem,
hogy mennyire nem jó, ha String
objektumokat + művelettel
konkatenálunk, ahelyett, hogy a StringBuffer
osztályt alkalmaznánk.
Nézzük a következő kódot, ahol az egyik metódus az egyik, a másik a másikat használja.
public class Test {
public void good() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 10; i++) {
sb.append("a");
}
System.out.println(sb);
}
public void bad() {
String s = new String();
for (int i = 0; i < 10; i++) {
s += "a";
}
}
}
Ha lefordítjuk, és utána ráengedjük a javap utilt (javap -c Test), akkor láthatjuk, a disassemblált kódot.
A rossz megoldásnál a ciklus törzsében mindig létrehoz egy
StringBuffer
-t, és a két szöveget hozzákapcsolja, majd meghívja a
toString
metódust. Mint tudjuk, a példányosítás elég erőforrásigényes
művelet, így sokat takarítunk meg, ha csak egyszer fut le.