E 'per un'ottimizzazione memoria eseguita dal compilatore ... cioè, String
costanti (cioè - String
s ottenuti con gli stessi String
letterale) utilizzano lo stesso String
oggetto dal Strings
sono immutabili. L'operatore ==
controlla solo che due oggetti siano lo stesso oggetto reale.
Se riesci ad afferrare il libro Java Puzzlers di Joshua Bloch e Neal Gafter, e guarda il puzzle 13, "Animal Farm" ... ha ottimi consigli su questo argomento. Ho intenzione di copiare un testo rilevante:
"Si può essere consapevoli che le costanti in fase di compilazione di tipo String
sono internati [JLS 15.28] In altre parole ogni due espressioni costanti di tipo String
che designano la stessa sequenza di caratteri sono. rappresentato da riferimenti di oggetti identici ...Il tuo codice dovrebbe raramente, se mai, dipendere dall'internamento delle costanti di stringa. Interning è stato progettato esclusivamente per ridurre l'ingombro della memoria della macchina virtuale, non come strumento per i programmatori ... Quando si confrontano i riferimenti agli oggetti, è preferibile utilizzare il metodo equals
per l'operatore ==
a meno che non sia necessario confrontare l'identità dell'oggetto piuttosto che il valore .".
Questo è dal riferimento di cui sopra ho accennato ... pagine 30 -. 31 nel mio libro
Per informazioni sul pool di stringhe, dai un'occhiata a wikipedia: http://en.wikipedia.org/wiki/String_interning (+1 stessa idea) –
Sì, i letterali stringa sono automaticamente internati, come da metodo interno API - http : //java.sun.com/javase/6/docs/api/java/lang/String.html – Ash
Non sono solo i letterali internati, ma anche le costanti di compilazione. –