人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JAVAの質問です。(equalメソッドについて教えて下さい)

?
下記のロジックでは、execute()は実行されることはないですよね?
("".equals(list)は、必ず偽となりますよね?)

-----------------------------------
Collection list = new ArrayList();
if("".equals(list)){
execute();
}
-----------------------------------

?
「"".equals(list)」の意味は、
String型の文字列「""」と、Collectionの「オブジェクトの識別値の文字列(String型)?」を比較しているのでしょうか?
("".equals(list.toString())と同じでしょうか?)

?
?について書籍やWEBで調べたいのですが、どこを見ればいいか分かりませんでした。
参考になるのがあれば教えて下さい。

以上です。上記3点のうち1つでも結構ですので、アドバイスを頂ければ助かります。

●質問者: nemutaiyo
●カテゴリ:コンピュータ インターネット
✍キーワード:ArrayList EQUAL Java String Web
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● あひる
●23ポイント

Javaのequalメソッドはオブジェクト同士が同じ参照を持っているかどうかを比較するメソッドです。なので、当然上記コードはfalseとなり、execute()は実行されません。

Javaチュートリアル 第4版 (The Java Series)

Javaチュートリアル 第4版 (The Java Series)

  • 作者: シャロン ザクァワ ジャコブ ロイヤル アイザック ラビノビッチ マーク ホーバ トーマス リーサ スコット ホンメル
  • 出版社/メーカー: ピアソンエデュケーション
  • メディア: 単行本

?に関しての解釈はあっています。""文字列とlist.toString()の結果が等しいかどうかを判定しています。

◎質問者からの返答

ありがとうございます。紹介頂いた本を読んで、基本から学びなおします。


2 ● b-wind
●23ポイント

?

下記のロジックでは、execute()は実行されることはないですよね?

("".equals(list)は、必ず偽となりますよね?)

yes

「"".equals(list)」の意味は、

String型の文字列「""」と、Collectionの「オブジェクトの識別値の文字列(String型)?」を比較しているのでしょうか?

("".equals(list.toString())と同じでしょうか?)

No

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.htm...(java.lang.Object):title]

String クラスで定義されている equals は比較対象も String クラスであり、かつ文字列として同等である必要がある。

?

?について書籍やWEBで調べたいのですが、どこを見ればいいか分かりませんでした。

参考になるのがあれば教えて下さい。

equals メソッドは何か特別なものではなく、普通にメソッドとして定義されているものなので

それぞれのクラスの API ドキュメントを見てください。ドキュメントがなければソースコードを読むしかないですが。


それぞれのクラスによって実装は違うのでたとえば以下の結果が真になることはあり得ます。

MyClass obj = new MyClass("文字列");
if ( obj.equals("文字列") ) {
 System.out.println("真");
}

これは MyClass の equals メソッドでそう実装されている場合です。

また、各クラスで equals を実装しなかった場合は大本である Object クラスの equals が呼び出されます。

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Object.htm...(java.lang.Object):title]

ここには equals メソッドを実装する場合のルールが書かれていますが、その通りであるかは実装した側のクラス定義次第です。

◎質問者からの返答

ありがとうございます。

>それぞれのクラスによって実装は違うのでたとえば以下の結果が真になることはあり得ます。

すみません。言葉足らずでした。

「Stringクラスのequalメソッドについて、教えて下さい」と書くべきでした。


3 ● quintia
●22ポイント

> 「Stringクラスのequalメソッドについて、教えて下さい」と書くべきでした。

StringクラスのequalsメソッドのAPI仕様を読むべきでしょう。


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

http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/String.htm...

とあるので、true になるのはメソッド引数が「String オブジェクトある」必要があることが分かります(「同じ文字シーケンスを表す StringBuffer」では駄目なわけですね)。


ところで、日本語訳だと「String オブジェクトでなければならない」とパッと見で分からない文になってしまっています。

妙だと思ったら英語のドキュメントも読むべきだと、私は思います。

Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object

http://java.sun.com/javase/6/docs/api/java/lang/String.html#equa...

"if and only if the argument is not null and is a String object that ?"という形式なので明確です。

これを訳したときに、単語の順番が逆になって分かりづらくなっています。


不明な点は、日本語APIドキュメント → 英語APIドキュメント の順に確認していくといいでしょう。

◎質問者からの返答

>不明な点は、日本語APIドキュメント → 英語APIドキュメント の順に確認していくといいでしょう。

了解です。質問する前に日本語APIを呼んだのですが、明確に分からなかったので質問しました。今後は英語APIも見ます。

ahirusanさんから、

>?に関しての解釈はあっています。""文字列とlist.toString()の結果が等しいかどうかを判定しています。

と回答頂きました。

つまり、条件としては、NULLでない→OK。Stringである→OK。同じシーケンス(文字列)である→NG ⇒結果False になる。ということですよね。

#疑問が少しあります。

自動的にtoString()されるのは、Stringクラスのequalsメソッドだからでしょうか?(例えば、list.equals(list)の場合は、toString()はされない?)またlist.toString()の文字列が""になることはないのでしょうか?


4 ● newta
●22ポイント

String の equalsメソッドのソースはこうみたいですよ。

 public boolean equals(Object anObject) {
if (this == anObject) {
 return true;
}
if (anObject instanceof String) {
 String anotherString = (String)anObject;
 int n = count;
 if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
 if (v1[i++] != v2[j++])
return false;
}
return true;
 }
}
return false;
 }

簡単そうならばドキュメント探して解釈をうーむと悩むよりも

ソースを見てしまったほうがスパッと分かると思いますよ。

オープンソースならばどんどんソースを見て行きましょうー

◎質問者からの返答

ありがとうございます。equalsメソッドの中身もデバッグで追ってみると、

if (anObject instanceof String) がfalseになり、

return false;が返りました。

つまり、anObjectオブジェクトはStringでない!ということがわかりました。(toString()されていない!)

>オープンソースならばどんどんソースを見て行きましょうー

おっしゃるとおりだと思いました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ