質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Q&A

解決済

2回答

1980閲覧

<Java>Java Silver黒本の問題です。Stringの参照値の切り替わりについて

kytm

総合スコア11

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

0クリップ

投稿2019/11/21 02:16

編集2019/11/21 02:59

Java Silver黒本の問題です。以下コード↓↓↓

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 です。

大枠としては納得できるしこの問題の意図も理解できるのですが、この解答に一つ違和感があります。

resultにvalが代入されて行く過程で、最終的にresultの値は"apple"という文字列になります。

その時点でstrにもともと定義されていた**"apple"という文字列にresultの参照値が切り替わる可能性があるのではないか?**と私は思いました。

つまり、実行結果は true : true となる可能性があるので、一概に false : true と言い切れるわけではないと思います。

実際のところどうなのでしょうか?ご教授よろしくお願い致します。

追記です。
「resultの参照値が切り替わる可能性がある」については以下のコードを実行した際に思いつきました。↓↓↓

String s = "moji";
String str = "moji";
System.out.println(str == s); //true

上記のコードのように同一の文字列"moji"をstrに代入した場合は"moji"のインスタンスが新たに生成され、sとstrの参照値が異なるものになるのではないか?と思ったのですが結果はtrueとなり、別々に生成したものなのに参照値が同じであることに気づいたからです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/11/21 02:24

>resultの参照値が切り替わる可能性がある これはどういう理屈でそういう可能性を思い立ったのか、具体的に記載していただけますか?
m.ts10806

2019/11/21 02:26 編集

そもそも文字列はequalsで比較しようね というだけの単純な例題に思うのですが
maisumakun

2019/11/21 02:37 編集

Pythonなど、「同じ表記の文字列は自動でインターンされて、参照値まで一致する(ことがある)」という言語環境も存在します。
cateye

2019/11/21 02:29

〉"apple"という文字列にresultの参照値が切り替わる可能性があるのではないか?と私は思いました。 (strとresultは別変数なのに)何故そう思われたのでしょう?
guest

回答2

0

ベストアンサー

その時点でstrにもともと定義されていた"apple"という文字列にresultの参照値が切り替わる可能性があるのではないか?

Oracleのリファレンスを読むと、文字列連結の結果は新たに生成されたStringオブジェクトになることになっています。既存のオブジェクトを使い回すことはありません。

文字列連結はStringBuilder (またはStringBuffer)クラスとそのappendメソッドを使って実装されています。(String

このシーケンス内のデータを表す文字列を返します。新しいStringオブジェクトが割り当てられ、現在このオブジェクトで表されている文字シーケンスを含むように初期化されます。(StringBuilder#toString


もっとも、「Stringのインスタンスが同じか違うか」を気にしないといけないコードは、それ自体が適切ではないので、実用的には考える必要はないかと思います。

投稿2019/11/21 02:27

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kytm

2019/11/21 03:06

なるほど、「文字列連結の結果は新たに生成されたStringオブジェクトになる」からなのですね。解決しました、ありがとうございます。
guest

0

自動で切り替わることはないと思いますよ。
不変オブジェクトであればメモリ効率のため、おなじオブジェクトは同じ参照になったら
良いなぁと思うかもしれませんが(いずれにせよ、メモリ効率の話で==で比較することはないと思います)

で、自動でなく手動で切り替えることは可能かといえば可能です。
String#intern()で、同じオブジェクトを参照します。

Stringでいうと、newでなくstr = "apple"という構文が、それです。
以下の場合、cはtrueになります。し、new String("apple")で初期化したら、falseになります。

java

1String str2 = "apple"; 2result = result.intern(); 3boolean a = str == result; 4boolean b = str.equals(result); 5boolean c = str == str2; 6System.out.println(a + ":" + b + ":" + c);

ちなみに、このケースを想定しているのであれば、それは言語仕様で決まっているからです。

java

1result = "a" + "p" + "p" + "l" + "e"; 2boolean a = str == result; 3boolean b = str.equals(result); 4System.out.println(a + ":" + b); // true:true

投稿2019/11/21 02:34

編集2019/11/21 02:41
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問