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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

1回答

2709閲覧

文字列リテラルにおいて、文字列の内容が一致する場合の”==”における真偽について

Velonica

総合スコア35

Java

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

1グッド

2クリップ

投稿2016/09/09 07:42

java

1String s1 = "abc"; 2String s2 = "abc"; 3String s3 = "a" + "b" + "c"; 4String s4 = "ab"; 5s4 += "c";

この文字列リテラル全てを"=="で比較したところ、s1, s2, s3を比較した場合は、全てtrueだったのに対して、s4を他のs1, s2, s3と比較するとfalseになってしまいました。

s4においても文字列の内容は他のs1, s2, s3と同じであるのに、偽になってしまうのかがわかりません。

"+="を用いると、StringBuilderのappendが内部で呼ばれることはわかっています。
このappendが内部で呼ばれることによって、オブジェクトを参照するアドレスが変わってしまうから偽になってしまうのでしょうか。
また、もしそうであるとしたら、s3では"+"を用いているので、ここでも新しいStringオブジェクトが生成されています。これは、Stringオブジェクトだから文字列リテラルにおいては問題はないということでしょうか。

equalsメソッドを使えば、こんなことを考えなくてもいいことはわかっています。
しかし、わからなくて、もやもやしてます。
お時間のある方、ぜひご教授ください。

A-pZ👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

文字列リテラルにおいては、同じ文字列を表すオブジェクトを何度も新規生成しなくてすむように、文字列をプールしています。同じ文字列リテラルが代入される場合には、この仕組みにより同じオブジェクトへの参照を帰します。これにより、s1とs2は同じという判定になります。
また、文字列リテラル同士の+演算子連結については、コンパイル時に最適化され、連結せずに一続きのリテラルで書いたのと同じ意味になります。従ってs3も"abc"と書いて代入したのと同じになり、s1,s2と同じになります。
s4はおっしゃるとおり、+演算子により新規のオブジェクトが生成されます。当然これまでのオブジェクトとは異なるものなので、これだけ「違う」という判定になるのです。

投稿2016/09/09 08:25

swordone

総合スコア20651

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

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

Velonica

2016/09/09 08:43

回答ありがとうございます。 なるほど、コンパイル時にそのような最適化がされていたんですね! 回答において、一つだけ質問があります。 s4においては、新規のオブジェクトが生成されるとありますが、s4は、 文字列リテラルではなく、String s4 = new String("abc"); のようなオブジェクトを生成した時と同じような状態になるということでしょうか?
swordone

2016/09/09 14:48

その通りです。
Velonica

2016/09/09 17:09

なるほど。 Stringクラスは使用者に見えないところですごいことをしてるんですね。 すごく勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問