I valori letterali delle stringhe sono internati automaticamente. Quindi s1 == s3 è vero. Le stringhe possono essere create nel pool costante di stringhe oppure possono essere create nello spazio heap. Se intern una stringa creata nell'heap, la stringa si troverà nel pool costante di stringhe.
Quando si crea una stringa letterale (String s1 = "string one"), la stringa viene creata nel pool di costanti di stringa. Inoltre, il pool di costanti di stringhe non memorizza i duplicati. Quindi, quando si dice,
String s1 = "string one";
String s3 = "string one";
Sia S1 e S3 punterà alla stessa istanza della stringa nella stringa piscina costante. Quindi s1.equals (s3) sarà vero. E s1 == s3 è anche vero; poiché entrambi i puntatori sono uguali.
Tuttavia, quando si crea un'istanza di una stringa utilizzando la "nuova" costruttore
String s2 = new String("string one");
poi s2 si crea nello spazio di heap. Lo spazio heap è un'area di memoria diversa rispetto al pool costante di stringhe
Quindi mentre s1.equals (s2) è vero, s1 == s2 è falso; dato che indicheranno diverse aree di memoria.
Tuttavia, è possibile convertire una stringa creata utilizzando il "nuovo" costruttore per spostarlo nel pool costante di stringhe richiamando la funzione intern(). Quindi s2.intern()
restituirà una stringa nel pool costante di stringhe; sebbene s2 sia stato originariamente creato nell'heap.
fonte
2011-09-20 02:15:43
Se sia o non sia di interesse passeggero, ma non dovresti farlo.'==' è per _object identity, _ not string confronti. – paxdiablo
@paxdiablo: se gestisci esclusivamente stringhe letterali, è ok usare '=='. Ma dover documentare che in genere è un tale dolore è più facile usare semplicemente 'equals()' su tutta la linea. –
sì, lo so tutto questo. ho programmato in Java per anni e mi stavo chiedendo :). non sembra che dovrebbe essere così ... –