先来看个例子:
User类中有个name属性,重写了equals方法,来验证两个对象是否相等,只要他们的name值相等,就认为这两个对象相等。
public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } @Override public boolean equals(Object obj) { User user = (User) obj; return user.getName().equals(this.name); } }
使用一个测试类,测试一下:
public class Test { public static void main(String[] a){ HashMap<User,String> hashMap = new HashMap<>(); hashMap.put(new User("jyy"),"abc"); System.out.println(hashMap.get(new User("jyy"))); } }
如果重写equals方法就能判断两个对象是否相等,那执行的结果一定是能找到!
结果如下:
并没有找到上面存入的对象所对应的值,说明只改写equals方法不能判断两个对象是否相等。
hashmap中比较两个对象相等时首先判断hashcode值是否相等,再使用equals判断:
尝试加入重写hashcode方法后,结果如何?
@Override public int hashCode() { return name.hashCode(); }
结果:
成功!所以重写equals方法,一定要重写hashcode方法!