2015-02-26 12 views
12

Mi sto preparando per l'esame OCA SE 7, e alcune di queste domande sono davvero (!) Ingannevoli.Conteggio delle stringhe nella piscina con println

In uno dei libri Im utilizzando Ho trovato un errore credo, quindi vorrei confermare quanto segue si prega di ...

public static void main(String... args) { 
    String autumn = new String("autumn");  // line one 
    System.out.println("autumn" == "summer"); // line two 
} 

Dopo il metodo println esegue, quanti String oggetti ci sono in la piscina?

E 'la mia comprensione che: - linea uno non aggiunge la stringa alla piscina - linea due crea "l'autunno" e "estate" e li aggiunge al pool Quindi la risposta corretta nel libro è 2 .

Tuttavia, penso anche ... poiché Im supposto per essere paranoica con le domande d'esame ... che viene creata anche la stringa "false" e aggiunto al pool ... Quindi penso che dovrebbe essere il 3 risposta corretta ... o qualche altra magia nera come ... "vero" e "falso" sono già inseriti nel pool dalla JVM per impostazione predefinita o qualcosa del genere? ...

Qualcuno può confermare ?


Edit: dopo alcune ricerche trovo che non era giusto da parte mia parlare di un 'errore' nel libro; come suggerimento generale: le domande d'esame sono solitamente formulate in termini di "codice seguente"; quindi sono chiaramente interessati al semplice semplice calcolo di ciò che il codice stesso sta facendo localmente. Pertanto, l'ambito non consente l'ispezione dell'implementazione println(boolean b) o delle ottimizzazioni del compilatore. Giusto abbastanza :)

+1

Questo è stato il mio punto di sotto nei commenti ... –

risposta

14

Dovrebbe essere 2 stringhe: "autumn" e "false". Il primo è creato dalla prima riga. Il secondo è stato creato dalla seconda linea perché il compilatore avrebbe ottimizzarlo a poco:

System.out.println(false); 

che finisce per chiamare PrintStream#print(boolean):

public void print(boolean b) { 
    write(b ? "true" : "false"); 
} 

Questo è ciò che accade in fase di esecuzione, vale a dire dopo il codice viene eseguito. Tuttavia, a livello del piscina costante immagazzinate nella bytecode, solo 1 stringa costante viene creato che è "nel file di classe della classe che contiene il metodo di main Lo si può verificare eseguendo:.

javap -c -verbose ClassName 
+6

sicuro circa la ultima frase? [Implementazione di 'PrintStream # print (booleano)'] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/io/PrintStream.java#PrintStream .print% 28boolean% 29). – Tom

+0

@Tom poi è stato aggiunto quando è stata caricata la classe PrintStream ... – immibis

+1

Beh, il fatto che la linea uno crei una stringa nella piscina mi fa davvero impazzire: mi è stato insegnato che usando il nuovo operatore si crea una stringa ma non si aggiungilo alla piscina ... –

0

true e false non sono oggetti String, quindi non contano.Anche se le domande d'esame dovrebbero essere complicate, l'obiettivo è verificare la comprensione dei concetti generali, che è in questo caso: durante il caricamento della classe (prima dell'esecuzione), i valori letterali delle stringhe vengono caricati nel pool costante, quindi "autunno" e "estate" saranno nel pool costante.

è descritto qui ben: http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html

+2

L'implementazione di 'PrintStream # print (boolean)' è: 'write (b?" True ":" false ");', quindi aggiungerà '" true "' e '" false "' al pool. ('#println (booleano)' chiama '#print (booleano)') – Tom

+0

Grazie @Tom: questa è l'implementazione che stavo guardando, ma suppongo che solo "vero" o "falso" saranno creati dal l'espressione è cortocircuito, no? –

+0

@krimat Domanda interessante. Potrebbe aggiungere tutti i letterali String se carica la classe, ma non lo so per certo. Forse [manoutis] (http://stackoverflow.com/questions/28752489/string-count-in-the-pool-with-println#28752534) il modo di verificare ti aiuta qui. – Tom

Problemi correlati