回答編集履歴

2

誤記

2018/05/06 15:56

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- (C)のような演算結果"abc"という文字列をString#internにより定数プールへ登録するような真似をするとJavaプログラム全体が致命的な速度低下を招くだろうと思います。それゆえ演算結果はinternされず結果としてコンスタントプールに存在する文字列リテラルと例えたまたま内が一致していたとしても「異なるインスタンス」となると思ってください。
45
+ (C)のような演算結果"abc"という文字列をString#internにより定数プールへ登録するような真似をするとJavaプログラム全体が致命的な速度低下を招くだろうと思います。それゆえ演算結果はinternされず結果としてコンスタントプールに存在する文字列リテラルと(例えたまたま内が一致していたとしても)「異なるインスタンス」となると思ってください。
46
46
 
47
47
 
48
48
 

1

間違いを訂正

2018/05/06 15:56

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- `String a = "abc";`
5
+ (A) `String a = "abc";`
6
6
 
7
7
 
8
8
 
@@ -10,11 +10,27 @@
10
10
 
11
11
 
12
12
 
13
- `String a = "ab" + "c";`
13
+ (B) `String a = "ab" + "c";`
14
14
 
15
15
 
16
16
 
17
+ このような単純ケースもコンパイラーがコンパイル時に連結演算をやってくれるためリテラルの参照がaに入ります。しかし
18
+
19
+
20
+
21
+ (C)
22
+
23
+ ```Java
24
+
25
+ String a1 = "ab";
26
+
27
+ Stirng a2 = "c";
28
+
29
+ String a = a1 + a2;
30
+
31
+ ```
32
+
17
- a入っているの"abc"という文字列ですがそれは文字列を連結した演算結果であってリテラルの参照りません。
33
+ このくらいともはやコンパイラーは「a中身が"abc"になるはず」という推論をあきらめちゃいま。そのため実行時に演算することになります文字列を連結した演算結果であってリテラルの参照りません。
18
34
 
19
35
 
20
36
 
@@ -26,4 +42,10 @@
26
42
 
27
43
 
28
44
 
29
- `String a = "ab" + "c";`のような演算結果"abc"という文字列をString#internにより定数プールへ登録するような真似をするとJavaプログラム全体が致命的な速度低下を招くだろうと思います。それゆえ演算結果はinternされず結果としてコンスタントプールに存在する文字列リテラルと例えたまたま内奥が一致していたとしても「異なるインスタンス」となると思ってください。
45
+ (C)のような演算結果"abc"という文字列をString#internにより定数プールへ登録するような真似をするとJavaプログラム全体が致命的な速度低下を招くだろうと思います。それゆえ演算結果はinternされず結果としてコンスタントプールに存在する文字列リテラルと例えたまたま内奥が一致していたとしても「異なるインスタンス」となると思ってください。
46
+
47
+
48
+
49
+ ---
50
+
51
+ 追記:コンパイル時に連結されるケースに配慮して説明を変更しました。