2011-12-20 7 views
5

Ho scoperto che Java supports constant folding of primitive types, ma che dire di String s?Il compilatore Java include String Constant Folding?

Esempio

Se creo il seguente codice sorgente

out.write("" 
     + "<markup>" 
     + "<nested>" 
     + "Easier to read if it is split into multiple lines" 
     + "</nested>" 
     + "</markup>" 
     + ""); 

Cosa va nel codice compilato?

Versione combinata? out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

Oppure la versione di concatenazione di runtime meno efficiente? out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

+0

La concatenazione di stringhe è circa 100 volte più veloce della scrittura su un dispositivo. Non sarebbe molto importante se non lo facesse (ma lo fosse) –

+0

L'ho appena testato sul mio laptop e le sue 50 volte più lente. –

+1

In realtà è un comportamento richiesto da JLS./Puoi vedere il codice generato con 'javap -c'. –

risposta

14

Ecco un test facile:

public static void main(final String[] args) { 
    final String a = "1" + "2"; 
    final String b = "12";   

    System.out.println(a == b); 
} 

uscita:

true 

Quindi, sì, il compilatore piega.

-1

si traduce in modo efficace per: out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

1

Sarà utilizzata la versione combinata.
Il compilatore lo ottimizza automaticamente e lo inserisce nel pool di stringhe.

È possibile provare facilmente questo comportamento scrivendo questa riga.

System.out.println("abc" == "a" + ("b" + "c")); // Prints true 

Che questa stampa vero, significa che sono gli stessi oggetti . Questo è a causa di due cose:

  1. Il compilatore ottimizzato "a" + ("b" + "c")-"abc".
  2. Il compilatore inserisce tutti i valori letterali stringa nel pool di stringhe. Questo comportamento si chiama String Interning.
+1

La prima parte di questo comportamento è denominata valutazione dell'espressione costante. – EJP