2012-12-15 18 views
6

come funziona? Non riesco a trovare una risposta.primitive-boolean To String concatenazione/conversione

boolean bool=true; 
System.out.println("the value of bool is : " + true); 
//or 
System.out.println("the value of bool is : " + bool); 
  • quali sono le cose che sono in corso dietro le quinte?
  • in che modo il valore booleano viene convertito nella stringa poiché un valore booleano non può essere implicitamente immischiato nel tipo ?
  • È Autoboxing/Unboxing coinvolto?
  • Sono in qualche modo coinvolti metodi come toString() o String.valueOf()?
+2

Leggi questo articolo: http://www.znetdevelopment.com/blogs/2009/04/06/java-string-concatenation/ –

risposta

13

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   
+1

il fatto che entrambi i frammenti di codice creino lo stesso bytecode significa necessariamente che il primo è convertito in quest'ultimo?(prima di essere convertito nel bytecode, cioè) –

+0

@VinayWadhwa Non penso che il JLS specifichi * come * si dovrebbe implementare la concatenazione delle stringhe - semplicemente quale dovrebbe essere il risultato. Tuttavia, per quanto posso ricordare, il compilatore Snorcle Java lo ha implementato usando un 'StringBuffer', quindi un' StringBuilder'. È probabilmente del tutto ammissibile che la concatenazione di stringhe sia un'operazione intrinseca nella JVM. – millimoose

+0

@VinayWadhwa Questo sembra essere implicito da [§15.18.1] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1): " Per aumentare le prestazioni della concatenazione di stringhe ripetute, un compilatore Java può utilizzare la classe StringBuffer o una tecnica simile ... "e" Per i tipi primitivi, un'implementazione può anche ottimizzare la creazione di un oggetto wrapper ... " – millimoose

2

È una cosa del compilatore. Se l'operando destro per la concatenazione è un oggetto, all'oggetto viene inviato il metodo toString() mentre se l'operando è una primitiva, il compilatore sa quale comportamento specifico del tipo utilizzare per convertire la primitiva in una stringa.

+0

vedo ... puoi indicarmi una documentazione che lo afferma? –

+0

@VinayWadhwa: vedi la mia risposta per un riferimento. –

2

Il compilatore traduce a

StringBuilder sb = new StringBuilder("the value of bool is : "); 
sb.append(true); 
System.out.println(sb.toString()); 

Le regole di concatenazione e conversione sono spiegate in the JLS.

+0

quale compilatore? ogni compilatore? se potessi indicarmi la fonte di queste informazioni, sarebbe molto apprezzato. Il riferimento fornito non è relativo alla risposta, penso .. –

+0

Dice: * Un'implementazione può scegliere di eseguire la conversione e la concatenazione in un solo passaggio per evitare di creare e quindi scartare un 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 String intermedi creati dalla valutazione di un'espressione. * Per conoscere le regole, leggere il JLS. Per sapere come funziona, leggi il bytecode generato dal tuo compilatore. –