Perché la stringa "Non capisco." entrare nel pool di stringhe.
La stringa "I don't get it."
non entra nel pool di internamento.
Un modo per verificarlo è la seguente:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2.append(" get it.");
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
Se il contenuto String
s' è internato, la chiamata di intern()
restituirà un oggetto diverso ('canonica'). Come puoi vedere, quanto sopra restituisce lo stesso oggetto, il che significa che l'oggetto su cui chiami intern()
diventa semplicemente "canonico" (cioè è stato internato).
D'altra parte, se si rimuove il append
, si otterrebbe un risultato diverso:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2;
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
Ora la stringa all'interno str3
è " I don't"
. La sua copia è già internata, perché è uguale alla costante di stringa utilizzata nella creazione dello str2
.
È possibile eseguire i programmi the first e the second fianco a fianco per vedere la differenza.
Il motivo per cui str2 == str3
è true
non ha nulla a che fare con i lotti di stringhe (la parola gergale è "string interning"). I due sono uguali perché StringBuffer.append
restituisce l'oggetto su cui viene invocato il append
, ad esempio str2
. Non hai un secondo oggetto: c'è solo uno StringBuffer
con due riferimenti. Il contenuto di tale StringBuffer
è la concatenazione delle stringhe " I don't"
e " get it."
.
@assylias: Sì, sarà, dal momento che 'append()' restituisce 'this'. –
L'OP è chiaro sul motivo per cui i due oggetti sono uguali. La domanda è: perché la stringa "Non capisco". sarà in pool di stringhe. –
E 'possibile che tu abbia frainteso il tuo istruttore, ma se per 'inserito nel" pool di stringhe "' come implicante il valore di StringBuffers sarebbe * internato *, che è *** sicuramente non corretto. – Perception