重写equals方法时,记住,也要重写hashCode方法(当你使用集合HashMap,HashSet,Hashtable)
看例子吧
[java]
package equalhashcode;
import java.util.*;
import bad.NewFileSize;
class Person {
private String username;
private int age;
public Person() {
}
public Person(String username,int age) {
this.username = username;
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
Person person = (Person)obj;
boolean flag = false;
if(this.username.equals(person.getUsername())&&this.age==person.getAge()) {
flag = true;
}
return flag;
}
}
public class EqualDemo {
public static void main(String[] args) {
Map map = new HashMap<>();
map.put(new Person("tree",25), "hello");
System.out.println(map.get(new Person("tree",25)));
}
}
返回结果是null,获取不到内容
而当我们重写了hashCode方法呢
[java]
@Override
public int hashCode() {
// TODO Auto-generated method stub
return age*2;
}
返回的结果就是hello了。
因为hashCOde有通用约定:
1、只要对象的equals方法所比较的信息没有修改,那么对这同一个对象调用多次,hashCode都必须始终如一的返回同一个整数。
2、如果两个对象equals比较相等,那么hashCode必须相等。
3、如果equals比较不相等,那么hashCode必须不相等。
至于hashCode怎么重写,首先你肯定要清楚equals方法所用到的字段,然后将这些字段完成到散列码的转换,至于如何操作,就看你自己如何定义了。
比如boolean,true->1,false->0等等
补充:软件开发 , Java ,