Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>If you have something like this:</p> <pre><code>Collection&lt;String&gt; strings = ...; String all = ""; for (String s : strings) all += s; </code></pre> <p>... then it's equivalent to:</p> <pre><code>Collection&lt;String&gt; strings = ...; String all = ""; for (String s : strings) all = new StringBuilder(all).append(s).toString(); </code></pre> <p>Each loops creates a new <code>StringBuilder</code> which is essentially a copy of <code>all</code>, appends a copy of <code>s</code> to it, and then copies the result of the concatenation to a new <code>String</code>. Obviously, using a single StringBuilder saves a lot of unnecessary allocations:</p> <pre><code>Collection&lt;String&gt; strings = ...; StringBuilder sb = new StringBuilder(); for (String s : strings) sb.append(s); String all = sb.toString(); </code></pre> <p>As for <code>x += y</code> versus <code>x = x + y</code>, they compile to the same thing.</p> <pre><code>class Concat { public String concat1(String a, String b) { a += b; return a; } public String concat2(String a, String b) { a = a + b; return a; } } </code></pre> <p>Compile it with <code>javac</code>, and then disassemble it with <code>javap</code>:</p> <pre><code>$ javap -c Concat Compiled from "Concat.java" class Concat extends java.lang.Object{ Concat(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."&lt;init&gt;":()V 4: return public java.lang.String concat1(java.lang.String, java.lang.String); Code: 0: new #2; //class java/lang/StringBuilder 3: dup 4: invokespecial #3; //Method java/lang/StringBuilder."&lt;init&gt;":()V 7: aload_1 8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 11: aload_2 12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 18: astore_1 19: aload_1 20: areturn public java.lang.String concat2(java.lang.String, java.lang.String); Code: 0: new #2; //class java/lang/StringBuilder 3: dup 4: invokespecial #3; //Method java/lang/StringBuilder."&lt;init&gt;":()V 7: aload_1 8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 11: aload_2 12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 18: astore_1 19: aload_1 20: areturn } </code></pre> <p>Personally, I'd favor <code>+=</code> because with it, you make a clearer statement of intent - "I want to add the content of <code>b</code> to <code>a</code>". Any variations in performance between the two forms are with a 100% certainty the result of something outside of your code (e.g., GC pauses, random cache misses or something like it). </p> <p>Bad compilers might also have a slightly easier time to optimize the <code>+=</code> form (which is irrelevant to you, since even if <code>javac</code> would be crappy, HotSpot sure isn't).</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload