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

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

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

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

Q&A

解決済

4回答

1224閲覧

Java Stringが参照する参照元

pikaso

総合スコア20

Java

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

0グッド

0クリップ

投稿2018/04/30 01:13

以下のコードですがStringBufferに変換したら実行結果がfalseとなりますが、Stringの場合はTrueになります。

分からないこと:
StringBufferの場合はaとa1オブジェクトがそれぞれ違う参照元を指しているということは理解していますが、Stringオブジェクトの場合はどうなのでしょうか。
この実行結果から見ると、Stringオブジェクトのaとa1は同じ参照元を指しているという結論になってしまいますが、この認識は正しいのでしょうか?

python

1public class Sample { 2 3 public static void main(String args[]) { 4 5 String a = "あいうえお"; 6 String a1 = "あいうえお"; 7 8 System.out.println(a == a1); 9 System.out.println(a.equals(a1)); 10 11 } 12 13}

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

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

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

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

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

guest

回答4

0

ベストアンサー

【Java】なぜ文字列リテラルは演算子で比較できる時があるのか

この記事を読むとわかるかと思いますが、リテラルの文字列はオブジェクトをプールし、
同じリテラルが登場した際に同じオブジェクトを参照させようとする仕組みがあります。

文字列リテラルはよく使われる反面、Stringの生成コストは高いので、できるだけ同じオブジェクトを使いまわそうとしているのでしょう。

この仕組みにより、a1に代入される参照もaの参照と同じになるので、trueとなります。
ただし、この動作はいつでも保証されるというわけでもないので、リテラルの代入どうしだとしても==で比較するのは避けましょう。

投稿2018/04/30 01:57

swordone

総合スコア20649

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

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

0

はい、Javaの場合、同じStringは同じオブジェクトになることがあります。というのも、Stringは一度生成すれば変更不可なので、同じのを共有してもデメリットがないからです。

ただし、同じにならないケースもありますので、よほど何かを狙ってやる場合を除けば、オブジェクトとしてのStringの比較は意味をなしません。

投稿2018/04/30 01:24

maisumakun

総合スコア145123

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

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

0

リテラルのStringは参照元は同じです。

ただし、次のようにすると参照元は異なります。

java

1String a = new String("あいうえお"); 2String a1 = new String("あいうえお"); 3System.out.println(a == a1); // false 4System.out.println(a.equals(a1)); // true

投稿2018/04/30 01:16

webarata3

総合スコア367

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

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

0

String a = "あいうえお";
String a1 = "あいうえお";

コード上で直接、値を設定しているので、一致しているだけ。

Stringの値は変更できません。(演算は、全て新しい領域に格納)
従って、コンパイラが同じ文字列と判断して、一つの領域を確保し、そこへの参照を初期値として設定しているだけです。従って、 a の値を変更しても、a1 の値は影響されません。

投稿2018/04/30 01:22

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問