2017-04-04 4 views
2

Ich verwende fast immer StringBuilder (int), um alberne Neuzuweisungen mit der kleinen Standardkapazität zu vermeiden. Hat irgendeine Javac-Implementierung etwas Spezielles, um eine angemessene Kapazität für implizite Anwendungen von StringBuilder in der Verkettung zu verwenden? Würde "abcdefghijklmnopqrstuvwxyz" + numbers + "!.?:" mindestens eine Anfangskapazität von 30 Literlängen verwenden?Implizite StringBuilder Größe

Antwort

4

Ja, es wird so intelligent sein - intelligenter, tatsächlich - in Java 9. (Dies ist etwas, das ich lose behaupten kann, ich war ein Teil von - I made der ursprüngliche Vorschlag, StringBuilders presize, und das inspiriert die bessere, leistungsfähigere Ansatz, die sie endete.)

http://openjdk.java.net/jeps/280 erwähnt speziell unter anderem, dass "manchmal müssen wir den StringBuilder angemessen presize", und das ist eine spezifische Verbesserung vorgenommen wird.

(Und die Moral von der Geschichte ist, Ihren Code zu schreiben, wie einfach und lesbar wie möglich und lassen Sie die Compiler und JIT der Optimierungen sorgen dafür, dass richtig ihre Arbeit sind.)

0

Dies kann auf Ihrem Compiler abhängen Version, Einstellungen usw.

Um dies zu testen, habe ich eine einfache Methode:

public static void main(String[] args) { 
    System.out.println("abcdefghijklmnopqrstuvwxyz" + args[0] + "!.?:"); 
} 

und nach dem Kompilieren und dann durch einen Decompiler ausgeführt wird, erhalten wir das folgende Ergebnis:

System.out.println((new StringBuilder()).append("abcdefghijklmnopqrstuvwxyz").append(args[0]).append("!.?:").toString()); 

Es scheint also, dass zumindest bei einigen Javac-Versionen nur der Standard verwendet wird.

Die manuelle Überprüfung des Bytecodes zeigt das Gleiche an.