[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10165] Re: equals() と ==



古橋と申します。

>>>>るといっている。それはその通りだと思うが、String以外の
>>>> オブジェクトでそれができるとは限らない。そうすると、
>>>> Stringの場合は"=="で比較するけど、Xxxxの場合はequals()で
>>>> 比較、とかになり、プログラマは混乱するのではないか?
>>>>
>>ここで「String以外でできるとは限らない」ってのはどういう
>>レベルで言ってるんでしょう?
>>#「利用できるが実装するのが面倒だ」というのならまだ分かる.
>>#利用できないというのはおよそ考え難い.
>>
>
>例えば、他のモジュールで生成されたインスタンスを利用するような場合、
>自分のモジュールからはすべてのインスタンスを参照できませんから、equals()
>による同値関係の比較が必要になるケースがあるのではないでしょうか。
>ServletやServletContextなど。
>(これらを比較するような必要があるかどうかは謎ですが)
>
>実際、レアケースなのかもしれませんが。
>
>>たしかにintern()はStringでのみ提供されているメソッドだと
>>思いますが,HashSetあたりを使えばそれと同等の処理を実装
>>するのは難しくないと思います.それさえ実現すれば==はどの
>>クラスのインスタンスでも使えるので実現可能なはずです.
>>#コレクションフレームワークはいまいち理解しきれてないので
>>#間違ってる可能性はある.とはいえ,HashSetが使えなくても,
>>#intern()と同等のメソッドを実現するのはさほど難しくは
>>#ないと思う.それだけ敷居が高くなるのは事実だが.
>>
>
>自前で管理となると大変そうですね。
>メモリ使用量も増えそうな気がします。
>(無責任な発言ですみません)
>
== はオブジェクトの比較で
たとえば、昨日買った○○屋のアンパンと
今日買った○○屋のアンパンがあったとします。

昨日買ったアンパンと、今日買ったアンパンは互いにオブジェクトとして
は別ものになっています。
つまり == は成り立ちません。

ただし、物としての比較は両方とも○○屋のアンパンなので
equals が成り立ちます。

equalsメソッドの実装はそうそう使う機会はありませんが、全然利用しない
というわけではありません。どうやって、昨日買ったパンと今日買ったパン
が同一のパンだと判断しますか?
それを、equalsメソッドで定義するのです。

StringクラスはJavaの言語仕様のなかでも特殊でFlyweightというパターン
を利用しています。
Stringクラスのインスタンスは一度文字列を生成させると変更することが
できません。つまり定数として利用されます。
"a" という文字列と "a"という文字列2つの"a"があったとしたら
どうせ定数なら1つのインスタンスで十分ですよね。2つとも同じ
文字列を参照すれば1つですみます。また、文字列の比較も == 同じ
オブジェクト同士であるかで比較をすればよくなるので比較の際のパフォーマンス
の向上を図ることができます。

ちなみに、Stringどおしの比較でも、
"aaa" == new String("aaa")
は「false」になります。
new キーワードを利用すると新規のオブジェクトを生成することになるので
理由はわかりますよね。これがわからないのであれば、軽率に文字列比較を
== で行わない方がいいですよ。

ちなみにintern()についての記述がでていたので、Sunのサイトでintern()の記述が
あるのでそちらを参照されてもいいかと思います。
>
http://jdc.sun.co.jp/cgi-bin/osform/jdcSession?page=individual/techtips/1999/tt0114.html
(ユーザ登録しないと見られませんが)

equals が尊守すべき「契約」を定義していると考えるのは、オブジェクトどお
しの比較
を行ったときに、その2つが同じであるといえるのかを定義しているからといえ
ます。


多分、初投稿になりますが長くなりました。
読書会等に参加できるときは本当はしたいと思っているので
よろしくお願いします。