2013-06-25 12 views
8

Riguarda la differenza nel risultato restituito dall'operatore '+'. Il risultato varia per String letterale e String Object.+ Operatore nella stringa Classe

String str="ab"; 
String str1="c"; 
String str2 = "ab"+"c"; // Line 3 
String str3 = "abc"; 
String str4 = str+str1; // Line 5 

System.out.println(str2==str3); // True 
System.out.println(str2==str4); // False 

Con il risultato si può dedurre che con letterale, oggetto già disponibili dal pool di stringa viene restituito come nel caso della linea 3 e con la stringa di oggetto nuovo oggetto viene restituito, come in linea 5. Perché è così ?

+0

Stavo confrontando l'uguaglianza referenziale in questo caso. – Prashant

+0

+1, voglio anche sapere il motivo, anche se presumo che sia perché si assegnano stringhe letterali 1-4 e si fa concatenazione in str4 Non sono sicuro se ci sia un altro motivo. – Thihara

risposta

9

L'opratore + per String s viene gestito in modo diverso a seconda del momento in cui è possibile valutare l'espressione.

Quando l'espressione può essere valutata in fase di compilazione (come nella riga 3) il compilatore creerà un String contenente solo la concatenazione. Pertanto nella riga 3 verrà creato solo il codice "abc" String e questo String verrà inserito nel file .class. Pertanto, str3 e str4 saranno esattamente gli stessi e verranno internati.

Quando si utilizza una concatenazione che può essere valutato solo in fase di esecuzione (come nella linea 5) risultante String è un nuovo String che deve essere confrontato wth equals() quanto è un nuovo oggetto.

3

String str2 = "ab"+"c"; questo è valutato a compile tempo. Va al pool costante, poiché è già noto al compilatore.

L'altro può essere valutato al runtime , non farà parte del pool costante.

E 'buona occasione per notare la differenza rispetto al caso in cui si utilizza String#concat, se si fa

String str2 = "ab".concat("c");

Dal String è immutabile, una nuova stringa viene restituita dal concat causando str non essere internati. Quindi in questo caso, str2 == str3 sarà false.

0

ho segnato la questione come duplicato, ma ha scoperto che la risposta simile non è distaccato così pensato di dare un andare. Altre risposte hanno già indicato perché la risposta è falsa. Ma ecco qualcosa che ti mostra quando sarà vero.

Se si chiama intern() sulla seconda stringa, il risultato sarà true.

Perché questo funziona?

per risparmiare memoria (e accelerare i test per l'uguaglianza), Java supporta “internato” delle stringhe. Quando il metodo intern() viene richiamato su una stringa, viene eseguita una ricerca su una tabella di stringhe internate. Se un oggetto String con lo stesso contenuto è già presente nella tabella, viene restituito un riferimento alla Stringa nella tabella. In caso contrario, la stringa viene aggiunta alla tabella e viene restituito un riferimento.

String str4 = (str+str1).intern(); 

esplicitamente invocando intern() ritorna un riferimento al internato String.

0

Quando creerai str, str1, str2 e str3, esso punterà allo stesso pool di stringhe. Qui non creerà oggetti stringa. Ma quando creerai String str4 = str + str1.So str4 viene valutato in runtime.Così non sarà parte dello stesso pool di string dove sono puntate tutte le altre stringhe.Questo str4 restituisce false ..

+0

Questo non è vero. Ad esempio, 'str == str1' è' false'. Saranno internati se sono valutati in fase di compilazione e hanno lo stesso valore di stringa. – Maroun

Problemi correlati