- ベストアンサー
Javaの参照型変数についての質問
- Javaの参照型変数に関する質問です。正解の選択肢はA、D、F、Gですが、Eの選択肢がfalseになる理由が分からないです。
- s3も文字列Helloのオブジェクトを生成しているので、s3 == "Hello"もtrueだと思います。アドバイスをお願いします。
- 質問文章はJavaの参照型変数についての問題で、正解の選択肢はA、D、F、Gです。しかし、Eの選択肢がfalseになる理由が分かりません。アドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
JavaにおけるString型変数は「参照」を格納する変数であり, 参照とは何か?を敢えて言い切ってみるとそれはアドレス・番地・ポインタです。 質問文のコードを実行した際,JavaVM上でリテラル"Hello"が確保された先頭番地が例えば40000番地であったと仮定する。 ▼String s1 = "Hello"; においてs1に代入されるのはその番地の値40000です。 質問文のコードには同一リテラルの"Hello"が3回登場しますが, String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); 同一リテラルである場合は3つ別々に確保するのではなく1つだけ確保してそれを共用しようとするのがJavaの特徴だというのはANo.2で解説されているとおり。 よって, ▼String s2 = "Hello"; においてs2に代入されるのも40000です。 ▼String s3 = new String("Hello"); だけは違って,先頭番地40000を引数として与えて,別の場所に文字列を新たにnewで確保している。よって元の40000番地とは別の場所に文字列が確保されます。s3に代入されるのは40000ではない値(非40000)です。 結論として,equalsによって「参照が指し示す先の内容を比較」するのではなく,==によって「参照値自体を比較」するのであればこうなります。 A. s1 == s2(40000 == 40000) B. s1 == s3(40000 == 非40000) C. s2 == s3(40000 == 非40000) D. s1 == "Hello"(40000 == 40000) E. s3 == "Hello"(非40000 == 40000)
その他の回答 (2)
- root139
- ベストアンサー率60% (488/809)
String(String) コンストラクタでは、引数と同じ文字シーケンスを表す新しいオブジェクト(インスタンス)が生成されます。 http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.html#String%28java.lang.String%29 つまり、new String("Hello") では、「Hello」を表すが引数の "Hello" とは別のオブジェクトが生成されます。また、 == で判定されるのは同じインスタンスか否かです。 したがって、new String("Hello") == "Hello" は false となります。 ちなみに A と D が true になる理由は、Javaの言語仕様に「文字列リテラルは常にクラス String の同じインスタンスを参照する」という決まりがあるからです。このことから "Hello" はどこに現れても同じインスタンスとなります。 個人的には、リテラルのインスタンスを指している事が分かっているString変数同士の比較であっても、必ず equals を使う方が良いと思っていますので、実際のコードでString同士を == で比較することはまず無いです。 (インスタンスの同一性が問題になる場合を除く)
お礼
返信ありがとうございました。 おかげで理解が深まりました。
- hitomura
- ベストアンサー率48% (325/664)
> s3も文字列Helloのオブジェクトを生成しているのですから、 > s3もHelloを参照していることになり ここがおかしい。 参照型の場合、==は参照している所が同一かどうかを確認し、内容が一致しているかどうかは確認しません(内容一致の確認はequals()の仕事です)。 このプログラムの場合、s1とs2はシステムがリテラルとして用意したHelloを参照し、s3はリテラルのHelloを元にプログラム内で新たに生成したHelloを参照しています。内容が同じでもその存在している場所が異なるため、==では別物と認識されます。
お礼
とても親切で詳細な解説をありがとうございました。
お礼
参照型変数・リテラル・番地などの具体的な例を用いての解説はすごく分り易かったです。 本当にありがとうございました。