2012-09-05 11 views
15

Eventuali duplicati:
intern() behaving differently in Java 6 and Java 7String stagista puzzle

Su questo blog ho trovato interessante puzzle String:

--- Citazione ---

String te = "te", st = "st"; 
//"test".length(); 
String username = te + st; 
username.intern(); 
System.out.println("String object the same is: " 
    + (username == "test")); 

stampe sotto Java 7 aggiornamento 7.

String object the same is: true

ma rimuovere il commento dalla .length "test"(); la linea, o correre con Java 6 e la stampa

String object the same is: false

--- --- EOQ

Essere onesti non capisco il motivo per cui le uscite sono diverse. Potresti per favore spiegarmi qual è la causa di tale comportamento?

+2

beh è 'false' in entrambi i casi –

+0

sì @Jigar ha ragione, quando ho provato il codice, l'output è false sempre –

+2

False o non differisce con la versione di Java. –

risposta

14

È necessario assegnare la stringa internati ritorna username:

String username = te + st; 
username = username.intern(); 

In questo caso entrambi i codici emetterà true.

Ecco un altro esempio interessante:

final String te = "te", st = "st"; 
"test".length(); 
String username = (te + st); 
System.out.println("String object the same is: " + (username == "test")); 

stampe vero pure, perché te e st sono contrassegnati come finale. Quindi il nome utente diventa una costante di tempo di compilazione e viene internato automaticamente.

EDIT

Come molte persone hanno sottolineato le stampe di codici falsi con Java 6, anche quando la linea "test".length è commentata.

Ciò è dovuto one of the changes introduced in Java 7:

in JDK 7, internati stringhe non vengono allocati nella generazione permanente del mucchio Java, ma vengono invece attribuiti nella parte principale del mucchio Java (noto come le generazioni giovani e meno giovani), insieme agli altri oggetti creati dall'applicazione.

Una conseguenza è che the code you posted has different outputs in Java 6 and 7 (vedere l'esempio nella parte inferiore della segnalazione di errore).

5

Si prega di verificare la risposta di Does String.intern() change reference of Original String

Non è la stringa che è cambiato, ma l'oggetto che viene utilizzato per "test" che è cambiato.

Quindi nel tuo caso, se "test" è definito prima che significa che se lo fai prima "test".length(); poi "test" è nel pool di stringa così primo risultato è false.

Ora if you comment this line poi dopo aver chiamato username.intern(); "test" viene aggiunto al pool di stringa ora la prossima "test" che si sta utilizzando per il confronto ottiene assegnati stesso oggetto che è stato messo da parte username.intern(); metodo. Quindi è true

così

Commented //"test".length(); -> True 
Un Commented "test".length(); --> False