Jestem świadomy, jeśli uczynićW jaki sposób JVM ponownie wykorzystuje internowane ciągi łańcuchowe?
for (condition) {
String s = "hi there";
}
Tylko jeden String
instancja jest tworzona we wszystkich iteracji, w przeciwieństwie String s = new String("hi there");
że stworzy nową instancję w każdej iteracji.
Ale czytając Effective Java z Joshua Bloch: Rozdział 2 pkt 5 (strona 20) stwierdza:
Ponadto zagwarantowane jest, że obiekt będzie ponownie wykorzystane przez inny kod uruchomiony w tym samym maszyna wirtualna, która zdarza się zawiera ten sam ciąg literowy [JLS, 3.10.5].
AFAIK, że nie mówi dzieje być ten sam ciąg dosłowne, mówi zawiera.
Czytanie [JLS, 3.10.5] nie może znaleźć dokładnego odniesienia do tego i mam wątpliwości.
Podając ten fragment:
String s1 = "hi ";
String s2 = "there";
String s3 = "hi there";
Ile przypadki są tworzone?
- 3 wystąpienia (a więc wyrażenie nie jest do końca dokładne).
- dwie instancje
s1
is2
(wtedys3
powstaje ponownes1
is2
odniesienia)
Prawdopodobnie oznacza "maszyna wirtualna zawiera ..", a nie ciąg zawiera inny ciąg –
Nie jestem pewien, więc komentarz zamiast odpowiedzi. Ale myślę, że "zawierają" jest częściowo błędne, a twój przykład rzeczywiście daje trzy przykłady. – glglgl
@glglgl faktycznie jest tym, co * moja logika * mówi, ale może być JVM wystarczająco inteligentny, aby utworzyć 's3' jako odniesienie do' s1' + 's2' ?? –