La risposta è legata a specifiche implementazioni del linguaggio (librerie di compilazione e runtime). Anche alla presenza di opzioni di ottimizzazione specifiche o meno. E, naturalmente, versione dell'implementazione (e, implicitamente, la JLS è compatibile con). Quindi, è meglio parlare in termini di minimi e massimi. In effetti, questo esercizio dà una migliore
Per Ex1, il numero minimo di oggetti è 1 (il compilatore si rende conto che ci sono solo costanti coinvolte e produce solo il codice per String s= "abc" ;
). Il massimo potrebbe essere qualsiasi cosa, a seconda dell'implementazione, ma una stima ragionevole è 8 (dato anche in un'altra risposta come il numero prodotto da una determinata configurazione).
Per Ex2, il numero minimo di oggetti è 2. Il compilatore non ha modo di sapere se abbiamo sostituito StringBuilder con una versione personalizzata con semantica diversa, quindi non ottimizzerà. Il massimo potrebbe essere intorno a 6, per un'implementazione StringBuilder estremamente ricca di memoria che espande un array di supporto char[]
un carattere alla volta, ma nella maggior parte dei casi sarà anche 2.
fonte
2013-08-19 02:33:42
Il primo esempio creerà 1 oggetto in quanto il compilatore può ottimizzarlo. –
javac lo ottimizzerà? –
L'esempio 1 genera questo: 'String s =" a "; s = (nuovo StringBuilder (String.valueOf (s))). Append ("b"). ToString(); s = (nuovo StringBuilder (String.valueOf (s))). Append ("c"). ToString(); System.err.println (s); '. Sembra che javac non lo stia ottimizzando (almeno in Java 6) –