061114003839[
00:38:39]
じゃばぁ久しぶりにJavaのライブラリのソースを読んだ。
せっかくなのでメモ。
Hash/TreeSetは、内部ではHash/TreeMapを使っている。
add(o)は中ではput(o, 何だか)だし、contains(o)はcontainsKey(o)。
手抜き、いや見事な再利用です。
で、なんでわざわざソースを読んだかっていうと、
重複チェックを実体に依存しないでやりたかったのですが、
equalsの上書きをしても上手くいかなかったからなのです。
そして開いてみたところ、そこには驚くべき事実が・・・!
いや、HashSetは文字通りhash値での比較をしていたってだけ。
つまりequalsを上書きしても無意味。
つまりequalsを上書きしても無意味・・・。
つまりequalsを上書きしても無意味・・・・・・。
ドキュメントが嘘大袈裟紛らわしい書き方するからだよ!もう!
ていうか、昨日はequals呼び出してたと思ったんだけどなぁ。
夢だったのかなぁ。
そんなで、hashCodeを上手いこと上書きすれば良いんだろうけど、
上手い方法が思い浮かばないので、TreeSetを使うことに。
TreeSetは入れる値にComparableの実装が必要で、
(実装してなくても入れる段階でのチェックはしてくれない。)
(実行時に型キャスト例外を出すだけ。)
そのcompaeToを重複チェックに使う。
でもなんかもったいないなぁ。順番いらないのに。
まぁ全然だけどね。なにかが。