①
下記のロジックでは、execute()は実行されることはないですよね?
("".equals(list)は、必ず偽となりますよね?)
-----------------------------------
Collection list = new ArrayList();
if("".equals(list)){
execute();
}
-----------------------------------
②
「"".equals(list)」の意味は、
String型の文字列「""」と、Collectionの「オブジェクトの識別値の文字列(String型)?」を比較しているのでしょうか?
("".equals(list.toString())と同じでしょうか?)
③
②について書籍やWEBで調べたいのですが、どこを見ればいいか分かりませんでした。
参考になるのがあれば教えて下さい。
以上です。上記3点のうち1つでも結構ですので、アドバイスを頂ければ助かります。
Javaのequalメソッドはオブジェクト同士が同じ参照を持っているかどうかを比較するメソッドです。なので、当然上記コードはfalseとなり、execute()は実行されません。
Javaチュートリアル 第4版 (The Java Series)
②に関しての解釈はあっています。""文字列とlist.toString()の結果が等しいかどうかを判定しています。
①
下記のロジックでは、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メソッドについて、教えて下さい」と書くべきでした。
> 「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()の文字列が""になることはないのでしょうか?
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()されていない!)
>オープンソースならばどんどんソースを見て行きましょうー
おっしゃるとおりだと思いました。
ありがとうございます。紹介頂いた本を読んで、基本から学びなおします。