重写equals步骤时,记住,也要重写hashCode方法(当你使用集合HashMap,HashSet,Hashtable)
重写equals方法时,记住,也要重写hashCode方法(当你使用集合HashMap,HashSet,Hashtable)
返回结果是null,获取不到内容
返回的结果就是hello了。
看例子吧
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方法呢
@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等等