HashMap のキーに自作クラスを使うには

以下のように自作のクラスを定義して,HashMap という形で使いたいとする.

class CoPair {
  String s1;
  String s2;

  ....
}

この場合,CoPair クラス内で equals(CoPair cp) と hashCode() の2つのメソッドを
オーバーライドしなければならない.詳細は
エンタープライズIT日記 HashMapのキーに自作クラスを使う場合の注意点
を参照のこと.

自分の思い込み

HashMap.get()が内部的に equals() を呼び出すと知っていたから,当初は equals() のみ定義していたが,これだけでは equals() が呼ばれない.

上記 Webページを参考にインプリしたコード

class CoPair {
  String s1;
  String s2;

  void set(String s1, String s2){
    this.s1 = new String(s1);
    this.s2 = new String(s2);
  }

  boolean equals(String s1, String s2){
    //入れ替えも含めて一致すれば OK
    if((this.s1.equals(s1) && this.s2.equals(s2))
       || (this.s1.equals(s2) && this.s2.equals(s1))){
	return true;
    } else {
	return false;
    }
  }

  @Override public boolean equals(Object cp){
    if(cp instanceof CoPair == false) return false;
    //入れ替えも含めて一致すれば OK
    if((this.s1.equals(((CoPair)cp).s1) && this.s2.equals(((CoPair)cp).s2)) 
       || (this.s1.equals(((CoPair)cp).s2) && this.s2.equals(((CoPair)cp).s1))){
      return true;
    } else {
      return false;
    }
  }

  @Override public int hashCode() {
    return s1.hashCode()+s2.hashCode();
  }

  @Override public String toString(){
    String s;
    s = "(" + s1 + "," + s2 + ")";
    return s;
  }
}