Le regole esatte sono scritte nel linguaggio Java Specification, §5.1.11. String Conversion
Secondo tali norme, "str" + bool
è equivalente a:
"str" + new Boolean(bool).toString()
Detto questo, il compilatore è consentito un notevole margine di manovra a come esattamente l'espressione complessiva viene valutata. Da JLS §15.18.1. String Concatenation Operator +:
L'attuazione può scegliere di eseguire la conversione e la concatenazione in un solo passo per evitare di creare e poi rimuovere l'oggetto String intermedio. Per aumentare le prestazioni della concatenazione di stringhe ripetute, un compilatore Java può utilizzare la classe StringBuffer
o una tecnica simile per ridurre il numero di oggetti intermedi String
creati dalla valutazione di un'espressione.
Per i tipi primitivi, un'implementazione può anche ottimizzare la creazione di un oggetto wrapper convertendo direttamente da un tipo primitivo a una stringa.
Ad esempio, con il compilatore seguente:
boolean bool = true;
System.out.println("the value of bool is : " + bool);
è esattamente equivalente a:
boolean bool = true;
System.out.println(new StringBuilder("the value of bool is : ").append(bool).toString());
fanno inoltre bytecodes identici:
Code:
0: iconst_1
1: istore_1
2: getstatic #59 // Field java/lang/System.out:Ljava/io/PrintStream;
5: new #166 // class java/lang/StringBuilder
8: dup
9: ldc #168 // String the value of bool is :
11: invokespecial #170 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
14: iload_1
15: invokevirtual #172 // Method java/lang/StringBuilder.append:(Z)Ljava/lang/StringBuilder;
18: invokevirtual #176 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
21: invokevirtual #69 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
24: return
Leggi questo articolo: http://www.znetdevelopment.com/blogs/2009/04/06/java-string-concatenation/ –