Według JLS (15,28 wyrażeniami) ekspresyjnym zawierającym tylko:wykonawcza ciąg oceny konkatenacji
i)Literals of primitive type and literals of type String (§3.10.1, §3.10.2, §3.10.3,
§3.10.4, §3.10.5)
or
ii)Simple names (§6.5.6.1) that refer to constant variables (§4.12.4).
or
iii)...
jest stałą ekspresję.
Teraz String s1="a"+"b";
jest wyrażeniem stałym i zostanie oszacowany na "ab"
w czasie kompilacji.
tak s1="ab";
[1] mam rację, mówiąc, że teraz istnieją trzy obiekty w basenie String gdyż zgodnie z powyższym stwierdzeniem: - "A", "B", "AB" ???
Teraz
final String s="a";
final String s1="b";
String s2=s+s1; // is also constant expression and get evaluated at compile time.
powyższy kod będzie transaled do s2="a"+"b";
po kompilacji.
dzięki czemu s2="ab";
zostanie automatycznie zapisany w puli ciągów.
Ale
// note there is no final now.
String s="a";
String s1="b";
String s2="a"+"b"; // constant expression.
String s3=s+s1; // is NOT a constant expression and get evaluated at RUN TIME.
dla String s3=s+s1;
, kod zostanie przetłumaczony na:
s3=new StringBuilder(String.valueOf(s)).append(s1).toString();
i utworzy nowy obiekt String.
dlatego s2==s3
będzie fałszywy;
Czy to oznacza wynik konkatenacji ciągów ocenianych w środowisku wykonawczym przy użyciu StringBuilder nie jest przechowywany w puli String, ale zamiast tego przechodzi do sterty (poza pulą)?
Należy pamiętać, że pula ciągów podczas etapu kompilacji nie jest taka sama, jak pula ciągów podczas uruchamiania programu. –
@ Thorbjørn Ravn Andersen: Fajna uwaga. możesz podać mi jakiś link lub źródło, gdzie mogę zobaczyć szczegóły twojego punktu. –