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

public class Sample {
public static void main(String[] args) {
String str = "apple";
String[] array = {"a", "p", "p", "l", "e"};
String result = "";
for(String val : array){
result = result + val;
}
boolean a = str == result;
boolean b = str.equals(result);
System.out.println(a + ":" + b);
}
}

これをコンパイル、実行した時の結果が問題として出されているのですが、実際に行うと
false : true
が出力され、それが答えになります。
これは同値性と同一性の問題で、==がfalseになる解説が
「==で同一性を判定していますが、2つの変数は同じ文字列を保持していても、参照しているStringのインスタンスは異なります。同じ参照先ではないため、==演算子はfalseを返します。」
と書かれています。
ここで疑問というか理解できないという部分が生まれました。
Stringは特別で、コンスタントプールという仕組みで、同じ文字リテラルがプログラム内で再び登場すれば文字列インスタンスへの参照が使い回されるはずです。いくら==を使用したからといって、trueが返されると思ったんですが。(そういう問題も出題であります。)
それで調べてみました。
http://qiita.com/tony_factories/items/4aa65f14be …
文字列結合後も==でtrueになるようです。
一応、
public class Sample {
public static void main(String[] args) {
String str = "apple";
String str2 = "" + "a"+"p"+"p"+"l"+"e";
boolean a = str == str2;
System.out.println(a);
}
}
を実行しましたら確かに true がコンソールに出ました。
なぜ false が出力されるのかわかりません。
どうかご回答お願い致します。

質問者からの補足コメント

  • はい、文字列リテラルの書き間違いです。

    String[] array = {"a", "p", "p", "l", "e"};
    String result = "";
    for(String val : array){
    result = result + val;
    }

    このresultは連結の結果、文字列リテラル"apple"になりますが・・・

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/05/23 23:52

A 回答 (2件)

Java の言語仕様において「文字列リテラル」がどう定義されているのか調べてみてください.

    • good
    • 0

「Stringは特別で、コンスタントプールという仕組みで、同じ文字リテラルがプログラム内で再び登場すれば文字列インスタンスへの参照

が使い回されるはず」と書いていますけど, 「文字リテラル」ではなく「文字列リテラル」ですよね. そして, 「文字列リテラル」だとしてもこのプログラムには適用されません. 「リテラル」とはどのようなものなのか, 確認してみてはいかがでしょうか?
この回答への補足あり
    • good
    • 0

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