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

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

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

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

Q&A

解決済

3回答

1579閲覧

equalsメソッド

sala

総合スコア17

Java

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

0グッド

0クリップ

投稿2020/09/08 01:56

Javaの勉強をしています。
オブジェクトを比較するときに同一性と同値性という違いがあります。

public class CompareStringBuilder { public static void main(String[] args) { var builder1 = new StringBuilder("あいう"); var builder2 = new StringBuilder("あいう"); System.out.println(builder1 == builder2); // 1 System.out.println(builder1.equals(builder2)); // 2 } }

上記の1は、違う同一性を比較しているのでfalseになります。
2は、同値性を比較しているのでtrueになると思ったのですが、1も2もfalseでした。

なぜでしょうか?

ちなみに、独習Javaというテキストのp92-93の内容です。
equalsのサンプルコードの表記が無いので、書き方が間違っているのかもと思い、投稿してみました。
よろしくお願いします。

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

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

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

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

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

1T2R3M4

2020/09/08 02:27

同値性はこんな風にはできないのでしょうか。 System.out.println(builder1.toString().equals(builder2.toString()));
guest

回答3

0

2は、同値性を比較しているのでtrueになると思ったのですが

はい、StringBuilder同士の比較は、中身を一切見ずに「同じインスタンスかどうか」だけで比較します。


StringBuilderはスレッドセーフ性も保証されていないように、本質的に引き回してあれこれ使うことを想定されていないクラスです。

投稿2020/09/08 02:40

maisumakun

総合スコア145184

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

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

0

少々面倒な話ですが、
全てのスーパークラスであるObjectのequalsメソッドも本来同一性であることを比較しています。

ただよく利用するStringのequalsは
Objectのメソッドをオーバーライドして同値であることを比較する処理になっており、
大体の解説本やサイトでもこのことには触れるので勘違いしがちですが
実はこちらが特殊な物となっています。

StringBuilderのequalsは特にObjectのをオーバーライドしているわけではないため、
同一性であることが比較されています。

投稿2020/09/08 02:24

yureighost

総合スコア2183

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

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

0

ベストアンサー

「同値(等価)である」の判定にはequalsメソッドを用いて比較をするというのは正しい認識です。
ですが、1点落とし穴があります。

Objectクラスのequalsメソッドのデフォルトでの定義は同一性を確認する仕様となっているのです。
この場合、

var builder1 = new StringBuilder("あいう"); var builder2 = new StringBuilder("あいう");

とあるようにそれぞれObjectをNEWしているのでObjectが異なり、同一性がないため、この時点でfalseが返却されるのです。
自作したオブジェクトクラスの同値性を判定したい場合はequalsメソッドをそのクラスでオーバーライドする必要があります。
詳しい方法は以下URLを参考にどうぞ
https://pointsandlines.jp/server-side/java/equals

投稿2020/09/08 02:16

mikan_s4n

総合スコア377

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

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

sala

2020/09/08 02:39

テキストには・・・ equalsメソッドは値を比較する。と書かれています。 さらに、StringBuilderオブジェクトであれば、含まれる文字列を比較するとなっています。 しかし、実行された結果と、回答いただいた内容を見ると、文面そのままでは無いように思えます。 そもそもサンプルコードが例示されていないのは、おっしゃるオーバーライドのことがあるのかもしれません。 いったん学習は進めて、学習の後に見直してみるとします。 ご回答ありがとうございました。
maisumakun

2020/09/08 02:41

> さらに、StringBuilderオブジェクトであれば、含まれる文字列を比較するとなっています。 しません。
sala

2020/09/08 02:44

結構有名な本なのに、残念ですね。 しかし、理解が深まりました。
mikan_s4n

2020/09/08 03:00

maisumakun さんの答えられている通りですね。 他の方も言及していますが、equalsは同一性を前提にしているため、こういったことが起きます。 intやbooleanなどのプリミティブ型は、Javaではクラスから作られたインスタンスではなく、値そのものなので==でもequalsでも同値性が確かめれる感じですね。 equalsメソッドでのオブジェクトの比較はインスタンス自体が同じかを確認するイメージかと思います。
Zuishin

2020/09/08 03:27 編集

有名な本だとしたら、おそらく訂正が入っていると思うので、読み間違いではないでしょうか。もっとも、有名というよりよく宣伝されている本で、初心者向けをうたった初心者しか読まないものにはひどいものもあるようです。頭に「ス」のつく本ですか?
sala

2020/09/09 05:28

>Zuishinさん 独習Javaですね(p92-93) Web見たんですけど、訂正もありませんでした。 https://wings.msn.to/index.php/-/A-03/978-4-7981-5112-0/ 他にも初心者の私が気づく間違いがあったのですが、訂正は無かったです。 明らかに本が間違っている箇所もあったので、私の読み間違いなのか、本の間違いなのか不安になります。 まあ、何はともあれ、結構お高いので最後まで読んで値段分の知識は獲得しようと思います。
Zuishin

2020/09/09 05:47 編集

読み間違いですね。Google ブックスで確認してみましたが、93 ページに書いてあるのは StringBuilder ではなく String です。 追記 失礼。私の読んだその前に書いてありました。 > そこで登場するのが、equals メソッドです。equals メソッドは、オブジェクトをその値でもって比較します。たとえば StringBuilder オブジェクトであれば、含まれる文字列を比較します。 確かに含まれる文字列を equals で比較すると書いてありますね。
sala

2020/09/10 00:19

確認していただいたのですね。ありがとうございます。 よかった。私の理解力が正常でよかった・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問