アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

String string1 = new String("あいうえお"); //(1)
String string2 = new String("あいうえお"); //(2)
String string3 = "あいうえお"; //(3)
String string4 = "あいうえお"; //(4)

System.out.println(string1 = = string2); //(5)
System.out.println(string3 = = string4); //(6)

実行結果
false
true

(5)がfalseになるのは分かるのですが、(6)がtrueになるのはなぜでしょう?また、(1)や(2)のようなStringオブジェクトの生成方法と(3)や(4)のようなStringオブジェクトの生成方法の違いは何でしょう?

よろしくご教授ください。

A 回答 (2件)

(1)(2)では新しいオブジェクトを作成して文字列リテラル"あいうえお"の内容をコピーしている。


(3)(4)では変数に文字列リテラル"あいうえお"オブジェクトへの参照を代入している。
(6)がtrueになるのはコンパイラが同一の文字列リテラルに対して複数のオブジェクトを作らないように実装されているからでしょうね。
言語仕様として必ずtrueになるという保証はないと思います。
    • good
    • 0
この回答へのお礼

やはりそういうことですか。言語仕様としてはかならずしもtrueにはならないのですね。コンパイラはSunのやつなので、本家はそういうコンパイルをするということなのですね。誠にありがとうございました。

お礼日時:2006/12/10 10:34

> (6)がtrueになるのはなぜ?



大ざっぱに説明すると、メモリを節約するために、
コンパイラが下のように書き換えているのです。

final String a = "あいうえお";
String string1 = new String(a);
String string2 = new String(a);
String string3 = a;
String string4 = a;

> (1)(2)と(3)(4)のStringオブジェクトの生成方法の違いは?

(1)(2)の方法では、コンストラクタに渡したStringと同じ内容を持つ
新しいStringオブジェクトを作ります。
内容は同じでも別のオブジェクトなので、
== で比較したときは false になります。
    • good
    • 0
この回答へのお礼

コンパイラはそのような工夫をするのですね。勉強になりました。ありがとうございました。

お礼日時:2006/12/10 10:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!