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

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

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

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

String

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

Q&A

解決済

6回答

1332閲覧

Javaにおける型違いの同値確認の方法

kurasivui

総合スコア15

Java

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

String

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

0グッド

0クリップ

投稿2020/08/26 06:03

編集2020/08/26 06:12

ご覧頂きありがとうございます。
以下、質問です。

質問

String型、StringBuilder型の両方に"A"参照を格納し、equalsで"A"と比較を行うと、StringBuilder型のみfalseが返ります。
equalsは「同値かどうかを見る」という認識の為、どちらもtrueになると予測していました。

「xxx.equals("A")」の"A"はString型と判定されるため、型が同じString型の「str」とは一致、StringBuilder型の「sb」とは不一致、という事でしょうか?
また、「sb」との同値判定はどう行うのでしょうか?

コード例と結果

java

1public class Sample{ 2 public static void main(String[] args) { 3 4 String str = new String("A"); 5 StringBuilder sb = new StringBuilder("A"); 6 7 // String と "A" 8 if(str.equals("A")) { 9 System.out.println(true); 10 } 11 else { 12 System.out.println(false); 13 } 14 15 // StringBuilderと "A" 16 if(sb.equals("A")) { 17 System.out.println(true); 18 } 19 else { 20 System.out.println(false); 21 } 22 } 23}

java

1結果 2true 3false

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

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

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

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

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

m.ts10806

2020/08/26 06:07 編集

>if(b1 = str.equals("A")) { 何のために代入しているのでしょうか。 代入しなくても単にtrue/falseだけ見たいのでしたら下記だけで十分ですが・・ System.out.println(str.equals("A"));
kurasivui

2020/08/26 06:10

すみません誤記です...。 b1は質問には不要なコード箇所で使っているのですが消し忘れていました。 出力には変わらないのでスルーして下さい。
m.ts10806

2020/08/26 06:12

なるべく「自身の現在のコード」そのままを提示してください。 でないと質問内容以前のところを突っ込む必要があったりして、本題に入りにくくなります。
kurasivui

2020/08/26 06:15

全体はかなり長いので質問部分だけ抜粋している次第です。 指摘頂いたbooleanは質問に影響しないので本題とはズレません。 誤記気を付けますね。
guest

回答6

0

ベストアンサー

equalsがtrueになるための条件は、それぞれのクラスのドキュメントに明記されています。

String#equals

引数がnullではなく、このオブジェクトと同じ文字シーケンスを表すStringオブジェクトである場合にだけ、結果はtrueになります。

StringBuilderのequalsメソッドはオーバーライドされておらず、「クラスjava.lang.Objectから継承されたメソッド」として名前だけ記載されています。この場合、定義は継承元から変わっていないため、Object#equalsと同じ、すなわち、引数が同じオブジェクトの場合のみ、trueになります。

内容を比較したいのであれば、StringBuilderはCharSequenceを実装しているので、String#contentEqualsが使えます。

投稿2020/08/26 06:16

編集2020/08/26 06:42
swordone

総合スコア20651

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

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

kurasivui

2020/08/26 06:19

なるほどメソッド見ていませんでした ありがとうございます
guest

0

sb.toString().equals("A") のように、お互いをString型にして比較すればtrueになります。

sb.equals(new StringBuilder("A")) はfalseになるので、
単純に型を合わせればいいというものでもないのですが、
もしtrueにしたいのであれば、今回はStringに寄せれば比較はできます。

投稿2020/08/26 06:27

root_jp

総合スコア4666

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

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

0

そもそも、型が違うからfalseになるのは、すでに指摘されていますが。
StringBuilderは、Object#equalsをオーバーライドしていないので、同一参照の時だけ、trueになるようです。

java

1StringBuilder sb1 = new StringBuilder("a"); 2StringBuilder sb2 = new StringBuilder("a"); 3StringBuilder sb3 = sb1; 4 5System.out.println(sb1.equals(sb2)); // false 6System.out.println(sb1.equals(sb3)); // true

投稿2020/08/26 06:24

momon-ga

総合スコア4820

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

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

momon-ga

2020/08/26 06:25

swordoneさんがすでに指摘してたの見逃した(タイミング?)< オーバーライドしていない
kurasivui

2020/08/26 06:27

書きながら型違いだよなあとは思っていましたが、オーバーライドは考えていませんでした。 ありがとうございます。
guest

0

通常、equalsメソッドは、オブジェクトが同値かどうか調べます。
参照しているオブジェクトが同一であるかということです。

他方、Stringクラスのequalsはオーバーライドされており、
オブジェクトが異なっても、文字列が同一な場合に同値と判定します。

また、「sb」との同値判定はどう行うのでしょうか?

文字列同士の比較にします。

Java

1sb.toString().equals("A")

投稿2020/08/26 06:17

kay-ws

総合スコア105

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

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

kurasivui

2020/08/26 06:22

toString後にequalsを付ければ良かったんですね... ありがとうございます
guest

0

equalsは「同値かどうかを見る」という認識

通常、型が違う値を同値とみなすようなことは行いません。

投稿2020/08/26 06:12

maisumakun

総合スコア145184

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

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

kurasivui

2020/08/26 06:17

やはり型ですよね ありがとうございます
maisumakun

2020/08/26 06:17

そもそも、StringBuilder.equalsは独自の実装がないため、StringBuilder同士ですらObjectデフォルトの通り「同じインスタンス」でないとequalsで一致しません。 そして、x.equals(y)とy.equals(x)は同じ結果となることが求められているため、StringBuilder以外のオブジェクトについても、.equals(StringBulderインスタンス)の結果はtrueとすべきではありません。
guest

0

単にStringとStringBuilderでは型が違うから不一致と言うだけだと思います。

投稿2020/08/26 06:11

m.ts10806

総合スコア80850

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

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

kurasivui

2020/08/26 06:18

そうですよね... ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問