teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

補足をもう一つ追加

2016/10/14 11:19

投稿

raccy
raccy

スコア21767

answer CHANGED
@@ -7,6 +7,7 @@
7
7
  後はもうわかりますね。`da1.getData() == da2.getData()`というところですが、`getData()`は`data`をそのまま返すだけです。`da1`の`data`も`da2`の`data`も同じ__objS1__というオブジェクトなのでtrueになる、ということです。
8
8
 
9
9
  ※ __objS1__は説明するためにつけた名前で、JavaVM内部で実際にそのような何か名前が付いているわけではなく、一意のID(番号)で管理されています。
10
+ ※ この性質は単体の文字列リテラルだけでは無く、定数式にも当てはまります。詳しくは後述の参考文献を参照してください。
10
11
 
11
12
  参考文献
12
13
  [Java言語規定 字句文法#3.10.5 文字列リテラル](http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm#101083)

5

リテラルについてはっきりするようにしてみた。

2016/10/14 11:19

投稿

raccy
raccy

スコア21767

answer CHANGED
@@ -1,8 +1,8 @@
1
1
  Javaの文字列リテラルには「既に同じ文字列リテラルを作っている場合は、同じオブジェクトを再利用する」という性質があります。この性質のために、このような現象が起きます。詳しく動きを見ていきましょう。
2
2
 
3
- `Data da1 = new Data("Test");`と言うコードで`"Test"`というStringのオブジェクトが作成されますが、このオブジェクトを仮に__objS1__と名前をつけておきましょう。この__objS1__は作成されると同時に`String.intern`というメソッドを使って、Java本体の共有プールに保存されます。共有プールでは"Test"は__objS1__と覚えていると思っておいてください。さて、この__objS1__はDataのコンストラクタの引数として渡されて、`da1`の`data`に代入されます。つまり、`da1`の`data`は__objS1__というオブジェクトへの参照値が入るっている状態になります。
3
+ `Data da1 = new Data("Test");`と言うコードで`"Test"`の部分は"Test"を意味する内容のStringのオブジェクトが作成されますが、このオブジェクトを仮に__objS1__と名前をつけておきましょう。この__objS1__は作成されると同時に`String.intern`というメソッドを使って、Java本体の共有プールに保存されます。共有プールでは"Test"は__objS1__と覚えていると思っておいてください。さて、この__objS1__はDataのコンストラクタの引数として渡されて、`da1`の`data`に代入されます。つまり、`da1`の`data`は__objS1__というオブジェクトへの参照値が入るっている状態になります。
4
4
 
5
- 次に`Data da2 = new Data("Test");`と言うコードを実行されることになります。おっと、"Test"はさっき作った文字列と同じですね。このように一度作ったことがある文字列リテラルの場合、共有プールに保存しておいたオブジェクトを探して、再利用します。共有プールでは"Test"は__objS1__として保存されているのでした。**よって、"Test"の部分は新たにオブジェクトを作成せずに__objS1__になります。**ここまで来たら後は同じです。__objS1__はDataのコンストラクタ引数と渡されて、`da2`の`data`に代入されます。結局、`da2`の`data`も__objS1__というオブジェクトへの参照値が入っている状態になります。
5
+ 次に`Data da2 = new Data("Test");`と言うコードを実行されることになります。おっと、"Test"はさっき作った文字列と同じですね。このように一度作ったことがある文字列リテラルの場合、共有プールに保存しておいたオブジェクトを探して、再利用します。共有プールでは"Test"は__objS1__として保存されているのでした。**よって、`"Test"`の部分は新たにオブジェクトを作成せずに__objS1__になります。**ここまで来たら後は同じです。__objS1__はDataのコンストラクタ引数と渡されて、`da2`の`data`に代入されます。結局、`da2`の`data`も__objS1__というオブジェクトへの参照値が入っている状態になります。
6
6
 
7
7
  後はもうわかりますね。`da1.getData() == da2.getData()`というところですが、`getData()`は`data`をそのまま返すだけです。`da1`の`data`も`da2`の`data`も同じ__objS1__というオブジェクトなのでtrueになる、ということです。
8
8
 

4

補足をちょっと修正。

2016/10/14 11:18

投稿

raccy
raccy

スコア21767

answer CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  後はもうわかりますね。`da1.getData() == da2.getData()`というところですが、`getData()`は`data`をそのまま返すだけです。`da1`の`data`も`da2`の`data`も同じ__objS1__というオブジェクトなのでtrueになる、ということです。
8
8
 
9
- ※ __objS1__は説明するためにつけた名前で、JavaVM内部で実際にそのような何か名前が付いているわけではありせん
9
+ ※ __objS1__は説明するためにつけた名前で、JavaVM内部で実際にそのような何か名前が付いているわけではなく、一意のID(番号)で管理されてい
10
10
 
11
11
  参考文献
12
12
  [Java言語規定 字句文法#3.10.5 文字列リテラル](http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm#101083)

3

ちょっと文章を修正

2016/10/14 11:16

投稿

raccy
raccy

スコア21767

answer CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  `Data da1 = new Data("Test");`と言うコードで`"Test"`というStringのオブジェクトが作成されますが、このオブジェクトを仮に__objS1__と名前をつけておきましょう。この__objS1__は作成されると同時に`String.intern`というメソッドを使って、Java本体の共有プールに保存されます。共有プールでは"Test"は__objS1__と覚えていると思っておいてください。さて、この__objS1__はDataのコンストラクタの引数として渡されて、`da1`の`data`に代入されます。つまり、`da1`の`data`は__objS1__というオブジェクトへの参照値が入るっている状態になります。
4
4
 
5
- 次に`Data da2 = new Data("Test");`と言うコードを実行されることになります。おっと、"Test"はさっき作った文字列と同じですね。このように一度作ったことがある文字列リテラルの場合、共有プールに保存しておいたオブジェクトを探して、再利用します。共有プールでは"Test"は__objS1__として保存されているのでした。**よって、"Test"の部分は新たにオブジェクトを作成せずに__objS1__になります。**ここまで来たら後は同じです。Dataのコンストラクタ引数と渡されて、`da2`の`data`に代入されます。結局、`da2`の`data`も__objS1__というオブジェクトへの参照値が入っている状態になります。
5
+ 次に`Data da2 = new Data("Test");`と言うコードを実行されることになります。おっと、"Test"はさっき作った文字列と同じですね。このように一度作ったことがある文字列リテラルの場合、共有プールに保存しておいたオブジェクトを探して、再利用します。共有プールでは"Test"は__objS1__として保存されているのでした。**よって、"Test"の部分は新たにオブジェクトを作成せずに__objS1__になります。**ここまで来たら後は同じです。__objS1__はDataのコンストラクタ引数と渡されて、`da2`の`data`に代入されます。結局、`da2`の`data`も__objS1__というオブジェクトへの参照値が入っている状態になります。
6
6
 
7
7
  後はもうわかりますね。`da1.getData() == da2.getData()`というところですが、`getData()`は`data`をそのまま返すだけです。`da1`の`data`も`da2`の`data`も同じ__objS1__というオブジェクトなのでtrueになる、ということです。
8
8
 
9
+ ※ __objS1__は説明するためにつけた名前で、JavaVM内部で実際にそのような何か名前が付いているわけではありません。
10
+
9
11
  参考文献
10
12
  [Java言語規定 字句文法#3.10.5 文字列リテラル](http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm#101083)

2

誤字の修正

2016/10/14 11:15

投稿

raccy
raccy

スコア21767

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  Javaの文字列リテラルには「既に同じ文字列リテラルを作っている場合は、同じオブジェクトを再利用する」という性質があります。この性質のために、このような現象が起きます。詳しく動きを見ていきましょう。
2
2
 
3
- `Data da1 = new Data("Test");`と言うコードで`"Test"`というStringのオブジェクトが作成されますが、このオブジェクトを仮に__objS1__と名前をつけておきましょう。この__objS1__は作成されると同時に`String.intern`というメソッドを使って、Java本体の共有プールに保存されます。共有プールでは"Test"は__objS1__と覚えていると思っておいてください。さて、この__objS1__はDataのコンストラクタの引数としてわたせれて、`da1`の`data`に代入されます。つまり、`da1`の`data`は__objS1__というオブジェクトへの参照値が入るっている状態になります。
3
+ `Data da1 = new Data("Test");`と言うコードで`"Test"`というStringのオブジェクトが作成されますが、このオブジェクトを仮に__objS1__と名前をつけておきましょう。この__objS1__は作成されると同時に`String.intern`というメソッドを使って、Java本体の共有プールに保存されます。共有プールでは"Test"は__objS1__と覚えていると思っておいてください。さて、この__objS1__はDataのコンストラクタの引数として渡されて、`da1`の`data`に代入されます。つまり、`da1`の`data`は__objS1__というオブジェクトへの参照値が入るっている状態になります。
4
4
 
5
5
  次に`Data da2 = new Data("Test");`と言うコードを実行されることになります。おっと、"Test"はさっき作った文字列と同じですね。このように一度作ったことがある文字列リテラルの場合、共有プールに保存しておいたオブジェクトを探して、再利用します。共有プールでは"Test"は__objS1__として保存されているのでした。**よって、"Test"の部分は新たにオブジェクトを作成せずに__objS1__になります。**ここまで来たら後は同じです。Dataのコンストラクタ引数と渡されて、`da2`の`data`に代入されます。結局、`da2`の`data`も__objS1__というオブジェクトへの参照値が入っている状態になります。
6
6
 

1

参考文献を追加

2016/10/14 11:12

投稿

raccy
raccy

スコア21767

answer CHANGED
@@ -4,4 +4,7 @@
4
4
 
5
5
  次に`Data da2 = new Data("Test");`と言うコードを実行されることになります。おっと、"Test"はさっき作った文字列と同じですね。このように一度作ったことがある文字列リテラルの場合、共有プールに保存しておいたオブジェクトを探して、再利用します。共有プールでは"Test"は__objS1__として保存されているのでした。**よって、"Test"の部分は新たにオブジェクトを作成せずに__objS1__になります。**ここまで来たら後は同じです。Dataのコンストラクタ引数と渡されて、`da2`の`data`に代入されます。結局、`da2`の`data`も__objS1__というオブジェクトへの参照値が入っている状態になります。
6
6
 
7
- 後はもうわかりますね。`da1.getData() == da2.getData()`というところですが、`getData()`は`data`をそのまま返すだけです。`da1`の`data`も`da2`の`data`も同じ__objS1__というオブジェクトなのでtrueになる、ということです。
7
+ 後はもうわかりますね。`da1.getData() == da2.getData()`というところですが、`getData()`は`data`をそのまま返すだけです。`da1`の`data`も`da2`の`data`も同じ__objS1__というオブジェクトなのでtrueになる、ということです。
8
+
9
+ 参考文献
10
+ [Java言語規定 字句文法#3.10.5 文字列リテラル](http://www.y-adagio.com/public/standards/tr_javalang/3.doc.htm#101083)