2013-05-22 22 views
5

Quindi sto studiando per SCJP dal libro di Kathy Sierra. Nel capitolo per le stringhe, questa è una domanda:Le stringhe utilizzate in un System.out.println creano anche nuovi oggetti immutabili?

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
--------------------------- 
What's the output, and how many string objects and ref variables are created? 

L'uscita è primavera estate inverno primavera e ci sono due variabili di riferimento, va bene.

Quindi dice che ci sono otto oggetti stringa creati (primavera, estate, primavera estate ... ecc.) INCLUSI quelli che si perdono a causa del fatto che nulla li fa riferimento.

Tuttavia, non include nulla dall'ultimo sysout.

La mia domanda è, nell'ultima riga di codice, poiché s1 e s2 sono concat con uno spazio, non crea anche nuovi oggetti? O sarà semplicemente passato al buffer delle stringhe per la visualizzazione e non creare nuovi oggetti?

Questo è ovviamente molto semplice e ho cercato altrove ma nulla ha risposto direttamente a questo. Dalla mia comprensione, dovrebbe creare anche nuovi oggetti, ma devo essere sicuro per l'esame! Pensieri?

Grazie, in anticipo!

+2

Compilare il codice sopra, alimentarlo con 'javap -c' e controllare quale codice di codice compila. Dovrebbe essere un 'StringBuffer' implicito che alla fine viene chiamato' toString() ', che dovrebbe rispondere alla domanda. – millimoose

+2

(Inoltre, la domanda è come tutto ciò che è sbagliato con la certificazione.Che cosa significa anche che una variabile di riferimento sia * creata *? Sono costrutti in fase di compilazione, sono dichiarati al meglio. C'è anche l'ambiguità che si genera dal momento in cui vengono creati string letterali, sicuramente vengono creati prima dei risultati delle operazioni di manipolazione delle stringhe. – millimoose

+0

@millimoose Penso che queste domande siano progettate per testare le tue conoscenze sull'istanza degli oggetti, le costanti jvm e String - tutte le aree molto valide :) – vikingsteve

risposta

5

La mia domanda è, nell'ultima riga di codice, poiché s1 e s2 sono concat con uno spazio, non crea anche nuovi oggetti?

Sì, crea una decima stringa.

Si noti che questo pezzo di codice in sé solo necessariamente crea 5 corde - se lo si esegue più volte nella stessa JVM, creerà 5 corde nuove ogni volta che si chiami. I valori letterali stringa non saranno creare una nuova stringa ogni volta che si esegue il codice. (Lo stesso oggetto stringa viene riutilizzato per "spring " di volta in volta, per esempio.)

ci sono 10 stringhe nel codice che hai dato:

  • 5 letterali: "primavera", "estate", " fall "," winter "e" "
  • 5 risultati di concatenazione: s1 + "summer", s1.concat("fall "), s1 + winter (con assegnazione composta) e s1 + " " + s2.

non Come ho appena commentato, una stringa letterale appare in codice non sempre coinvolgono una stringa separata. Ad esempio, si consideri:

String x = "Foo" + "Bar"; 

ci si potrebbe aspettare che, per coinvolgere tre oggetti stringa - uno per ognuno dei letterali, e uno per la concatenazione.In realtà, si tratta di una sola, perché il compilatore esegue la concatenazione a tempo di compilazione, in modo che il codice è efficace:

String x = "FooBar"; 
+0

Vuoi dire se esistono nel pool costante di stringhe, non verranno ricreati correttamente? Non creerà cinque stringhe? Compreso lo spazio nell'ultima riga di codice - "" Quindi cosa significa esattamente il libro, quando dice che crea oggetti stringa? Significa 9 oggetti stringa, ma solo 5 stringhe letterali? –

+0

A meno che non dica new() nel qual caso verrà creata una copia. –

+0

@ nilay9999: hai perfettamente ragione: ho sbagliato. Ci sono 10 stringhe; 5 letterali ('" spring "', '" summer "', '" fall "', '" winter "', '" "') e 5 risultati di concatenazione ('s1 +" summer "', 's1.concat ("fall") ',' s1 + winter' (con assegnazione composta) e 's1 +" "+ s2'). –

2

sarò anwser ad un altro, più chiara domanda: quante istanze String sono coinvolti nella seguente frammento di codice:

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
  1. String letterale "primavera"
  2. String letterale "estate"
  3. concatenazione di s1 e "estate"
  4. String letterale "caduta"
  5. concatenazione di s1 e "caduta"
  6. concatenazione di S2 e S1
  7. String letterale "invernale"
  8. concatenazione di s1 e "inverno"
  9. String letterale ""
  10. concatenazione di S1 ​​e S2 in sysout

Quindi, 10 in totale.

+0

Grazie per questo - stavo per chiedere a Jon Skeet di aggiungere questo alla sua risposta. Molto utile. –

+0

@AndrewMartin: Come indicato dall'OP, c'è anche "" - quindi ce ne sono 10 in totale. Ho perso anche quella prima volta. –

+0

@JonSkeet: Divertente, mi stavo solo grattando la testa. Ha senso ora, evviva. –