JAVA hashCode()のオーバーライド

##equals()をオーバーライドしても、HashSetでremove()できない
![スクリーンショット 2015-12-08 18.58.45.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c2844ea7-239e-fa8a-2c34-e871853a987f.png)
[参考になるサイト](http://hjm333.hatenablog.com/entry/2015/08/28/000748)
#hashCode()をオーバーライド
▪️Test54.java

```java
import java.util.*;

public class Test54 {
	public static void main(String[] args) {
		Set<Hero54> list = new HashSet<Hero54>();
		Hero54 h1 = new Hero54();
		h1.name = "ミナト";
		list.add(h1);
		System.out.println("要素数＝" + list.size());
		h1 = new Hero54();
		h1.name = "ミナト";
		list.remove(h1);
		System.out.println("要素数＝" + list.size());
	}

}
```

▪️Hero54.java

```java
import java.util.*;

public class Hero54 {

	private int hp;
	public String name;

	public boolean equals(Object o) {
		if (o == this)
			return true;
		if (o == null)
			return false;
		if (!(o instanceof Hero54))
			return false;
		Hero54 r = (Hero54) o;
		if (!this.name.trim().equals(r.name.trim())) {
			return false;
		}
		return true;

	}

	public int hashCode() {
		int result = 37;
		result = result * 31 + name.hashCode();
		result = result * 31 + hp;
		return result;
	}
}
```

▪️Test54.java 実行結果
要素数＝1
要素数＝0

#hashCode()をオーバーライドする前
▪️Hero54.java

```java
import java.util.*;

public class Hero54 {

	private int hp;
	public String name;

	public boolean equals(Object o) {
		if (o == this)
			return true;
		if (o == null)
			return false;
		if (!(o instanceof Hero54))
			return false;
		Hero54 r = (Hero54) o;
		if (!this.name.trim().equals(r.name.trim())) {
			return false;
		}
		return true;
	}
}
```

▪️Test54.java 実行結果
要素数＝1
要素数＝1

**hashSetは
・重複が許されない
・基本的に順序関係がない**


---
#hashCode()をオーバーライド例②
▪️Test55.java hashCode()をオーバーライド例②

```java
import java.util.*;

public class Test55 {
	public static void main(String[] args) {
		Set<Cat55> cat = new HashSet<Cat55>();
		Cat55 c1 = new Cat55();
		c1.name = "ねこ";
		Cat55 c2 = new Cat55();
		c2.name = "ねこ２";
		Cat55 c3 = new Cat55();
		c3.name = "ねこ３";
		cat.add(c1);
		cat.add(c2);
		cat.add(c3);
		System.out.println(c1);
		System.out.println(cat.size());
		cat.remove(c2);
		System.out.println(cat.size());

	}

}
```

▪️Cat55.java hashCode()をオーバーライド例②

```java
public class Cat55 {
	private int cp;
	public String name;

	public boolean equals(Object o) {
		if (o == this)
			return true;
		if (o == null)
			return false;
		if (!(o instanceof Cat55))
			return false;
		Cat55 f = (Cat55) o;
		if (!this.name.trim().equals(f.name.trim())) {
			return false;
		}
		return true;
	}

	public int hashCode() {
		int catResult = 13;
		catResult = catResult * 31 + name.hashCode();
		catResult = catResult * 31 + cp;
		return catResult;
	}

}
```

<FONT color="#ff0000">要するに「hashCodeが一致してequalsがtrueを返すものは同じものとして扱われる」ってだけです。hashCodeが一致しなきゃそもそもequalsなんて評価もされない。</font>

▪️Test55.java hashCode()をオーバーライド例② 実行結果
Cat55@bbd407
3
2

▪️補足
Cat55.javaは

```java
public class Cat55 {
	public int cp;
	public String name;

	public boolean equals(Object o) {
		if (this.name == o) {
			return true;
		}
		return false;
	}

	public int hashCode() {
		int catResult = 13;
		catResult = catResult * 31 + name.hashCode();
		catResult = catResult * 31 + cp;
		return catResult;
	}

}
```

にしても結果は同じ