只有类的实例对象要被采用哈希算法进行存入和检索时,这个类才需要按要求复写hashCode()方法,即使程序可能暂时不会用到当前类的hashCode()方法,但是为提供一个hashCode()方法也不会有什么不好,没准以后什么时候就会用到这个方法,所以通常要求hashCode()和equals()两者一并被覆盖。简单来说,就是默认的hashCode()方法可能不是我们需要的,而且这种算法可能会导致两个不同的对象获得的哈希值会相同,那么就会产生意想不到的结果,所以需要覆写hashCode()方法。
需要注意的是,当对象每次调用方法时,会先调用hashCode()的方法:- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.HashSet;
- public class ReflectTest2 {
- public static void main(String [] args){
- Collection cons = new HashSet();
- ReflectPoint pt1 = new ReflectPoint(3,3);
- ReflectPoint pt2 = new ReflectPoint(5,5);
- ReflectPoint pt3 = new ReflectPoint(3,3);
- cons.add(pt1);
- cons.add(pt2);
- cons.add(pt3);
- cons.add(pt1);
- cons.remove(pt1);
- System.out.println(cons.size());
- }
- }
- public class ReflectPoint {
- private int x;
- public int y;
- public String str1 = "ball";
- public String str2 = "basketball";
- public String str3 = "itcast";
-
- public ReflectPoint(int x, int y) {
- super();
- this.x = x;
- this.y = y;
- }
-
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + x;
- result = prime * result + y;
- //System.out.println("demo...");//测试
- return result;
- }
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- ReflectPoint other = (ReflectPoint) obj;
- if (x != other.x)
- return false;
- if (y != other.y)
- return false;
- return true;
- }
- public String toString(){
- return str1+";" + str2 + ";" + str3;
- }
- }
复制代码 你把测试的那个注释打开,你就看到现象了。
|