エンジニア的なネタを毎週書くブログ

東京でWebサービスの開発をしています 【英語版やってみました】http://taichiw-e.hatenablog.com/

Javaでequalsを実装するとき -失敗するとcontainsが動かない-

hashCodeはもちろん実装しましょう。

で、

public class 俺のクラス {
   
    private String ore;
    public 俺のクラス (String ore) {
        this.ore = ore;
    }
    public boolean equals(俺のクラス o) {
        return ore.equals(o.getOre());
    }
    ...
}

ってやったらダメ。一見まともに動くんですが…

俺のクラス o1 = new 俺のクラス("hoge");
俺のクラス o2 = new 俺のクラス("hoge");
俺のクラス o3 = new 俺のクラス("foo");

// true
o1.equals(o2);

// false
o1.equals(o3);

Correctionのcontainsがちゃんと動かない。

 Set<俺のクラス> os = new HashSet<>();
os.add(o1);

//もちろんtrue
os.contains(o1);

//trueになるかとおもいきやfalse
os.contains(o2);

正しいequalsの実装はこう。

     public boolean equals(Object o) {
        ほげほげ
    }

 

こんなところでしばらくハマってしまった…

 

 

ちなみにはまってる間、色々調べていてわかったのですが、
HashSetって内部的には単一のObjectをValueにもってるHashMapなんですね。(java7だと)

Mapのキーの管理にSet使うならわかるんだけど実態は逆で不思議。