2016-03-30 3 views
3

Ich habe einige Zeilen Code wie folgt. Hier ist meine Frage welche bevorzugen?Zeichenfolge Variablen Verkettung

public static String convertMapToString (Map < String, String > map) 
{ 
    StringBuilder str = new StringBuilder (200) ; 
    for (Entry < String, String > entry : map.entrySet ()) 
    { 
     str.append (entry.getKey() + " = " + entry.getValue()) ; 
    } 
    return str.toString() ; 
} 

oder Soll ich mit folgenden weil ich bezweifle, dass appned Aussage über zwei weitere zusätzliche Strings als Folge der + Betrieb in jeder Iteration erstellen können.

public static String convertMapToString (Map < String, String > map) 
{ 
    StringBuilder str = new StringBuilder (200) ; 
    for (Entry < String, String > entry : map.entrySet ()) 
    { 
     str.append (entry.getKey()); 
     str.append (" = "); 
     str.append (entry.getValue()) ; 
    } 
    return str.toString() ; 
} 
+4

dekompilieren beide Versionen und schauen, was der Compiler mit ihnen gemacht hat. – Tom

+2

Das zweite Snippet erzeugt wahrscheinlich weniger String-Objekte als das erste, also würde ich es bevorzugen. – Eran

+0

@Tom Einverstanden, meine Vermutung ist, dass Option Nummer 2 "besser" ist, weil die Strings verkettet werden müssen, und der 'StringBuilder' müsste die gleiche Anzahl von' char' durchlaufen. Also Option 1 scheint die gleiche wie Option 2 zu sein, aber mit einer zusätzlichen unnötigen Verkettung – Maljam

Antwort

3

Durch konventionelle Weisheit, für eine optimale Strings Verkettung sollten Sie die StringBuilder.append Methode bevorzugen, so dass die Option 2 in Ihre Beispiele wären.

Beachten Sie, dass nach language spec auch wenn Sie verwenden Sie die "+" Verkettung, die Umsetzung könnte wählen diejenigen in StringBuilder.append zu optimieren, aber es ist nicht garantiert, so würde ich vorschlagen, immer auswählen 2, wenn eine optimale Ausführung Ihre erste Priorität ist .

+0

Danke für diesen Spec Link – SacJn

+0

@SacJn - Gern geschehen – Jas

0

Version zwei wird bevorzugt, da Version 1 unnötigerweise eine Menge Objekte erzeugt und merklich langsamer arbeitet.

String-Verkettung wird kompiliert, um einen neuen StringBuilder zu erstellen, append für jeden Teil anzufügen und dann toString aufzurufen.

1

Für die Lesbarkeit: die erste.

Für Leistung: die zweite

Der zweite Code sollte weniger Objekte erzeugen und so schneller sein und weniger Speicher. (Obwohl die Compiler versuchen werden, den Code zu optimieren, um StringBuilders zu verwenden, aber wie @Jas sagte: es ist nicht gerechtfertigt)

Jetzt, wissen, dass, was auch immer Sie brauchen oder was auch immer Sie denken, das besser in Ihrem Fall passt.

Normalerweise verwende ich StringBuilders nur in Schleifen und String-Zusatz außerhalb von ihnen.

+1

Aber die verwendete Speicher und alle: ist das nur eine wilde Vermutung, weil Sie denken, dass es so sein könnte, oder haben Sie tatsächlich die kompilierten Ergebnisse verglichen? – Tom

+2

Sie sind richtig, @ Tom, ich habe die Antwort bearbeitet. Es wird empfohlen, die gleiche Leistung und den gleichen kompilierten Code zu haben, aber es ist nicht gerechtfertigt. Also, wenn Sie sicher sein wollen, dass StringBuilders verwendet werden, sollten Sie sie selbst in Ihren Code einfügen oder den gesamten kompilierten Code kompilieren, um ihn zu überprüfen (und natürlich, wenn Sie den Compiler ändern; wieder). Deshalb bin ich StringBuilders innerhalb von Schleifen und einfachen Funktionen und String-Addition außerhalb von ihnen. – inigoD