Java强调当重写equals()时需要同时重写hashcode()方法,假设两个不同对象,在内存中的地址不同分别为a和b,那么重写equals()以后a.equals(b) =true 开发者希望把a,b这两个key视作完全相等
然而由于内存地址的不同导致hashcode不同,会导致在hashmap中储存2个本应相同的key值;
如果不被重写(原生)的hashCode和equals是什么样的?
1. 不被重写(原生)的hashCode值是根据内存地址换算出来的一个值。
2. 不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2)。
示例代码demo1:
1. 没有重写equals
package com.compareObject;
/**
* @Auther: 13213
* @Date: 2020/5/26 14:22
* @Description:
*/
public class Dog {
private int age;
private String name;
public Dog(int age,String name){
this.age=age;
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// @Override
// public boolean equals(Object obj) {
// if(obj==null){
// return false;
// }
// if(this==obj){
// return true;
// }
// if(obj instanceof Dog){
// Dog dog=(Dog)obj;
// if(dog.age==this.age&&dog.name.equals(this.name)){
// return true;
// }else{
// return false;
// }
// }
// return false;
// }
public static void main(String[] args){
Dog dog1=new Dog(12,"wangcai");
Dog dog2=new Dog(12,"wangcai");
Dog dog3=new Dog(16,"wangcai");
System.out.println(dog1.equals(dog2));//true
System.out.println(dog1.equals(dog3));//false
}
}
运行结果:
2. 重写equals
package com.compareObject;
/**
* @Auther: 13213
* @Date: 2020/5/26 14:22
* @Description:
*/
public class Dog {
private int age;
private String name;
public Dog(int age,String name){
this.age=age;
this.name=name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if(obj==null){
return false;
}
if(this==obj){
return true;
}
if(obj instanceof Dog){
Dog dog=(Dog)obj;
if(dog.age==this.age&&dog.name.equals(this.name)){
return true;
}else{
return false;
}
}
return false;
}
public static void main(String[] args){
Dog dog1=new Dog(12,"wangcai");
Dog dog2=new Dog(12,"wangcai");
Dog dog3=new Dog(16,"wangcai");
System.out.println(dog1.equals(dog2));//true
System.out.println(dog1.equals(dog3));//false
}
}
运行结果:
示例代码demo2:
package com.compareObject;
import java.util.Collection;
import java.util.HashSet;
/**
* @Auther: 13213
* @Date: 2020/5/26 14:22
* @Description:
*/
public class Test {
public static void main(String[] args) {
Name n1 = new Name("zcj001");
Name n2 = new Name("zcj001");
Collection c = new HashSet();
c.add(n1);
c.add(n2);
System.out.println(n1.equals(n2));
System.out.println(n1.hashCode());
System.out.println(n2.hashCode());
System.out.println(c);
}
}
class Name {
private String id;
public Name(String id) {
this.id = id;
}
public String toString(){
return this.id;
}
public boolean equals(Object obj) {
if (obj instanceof Name) {
Name name = (Name) obj;
return (id.equals(name.id));
}
return super.equals(obj);
}
public int hashCode() {
return id.hashCode();
}
}
运行结果:
当只重写equals()不重写hashCode()运行结果如下:
示例代码demo3:
package com.compareObject;
/**
* @Auther: 13213
* @Date: 2020/5/26 14:22
* @Description:
*/
public class Test {
public static void main(String[] args) {
String a = "123";
String b = "123";
System.out.println(a.equals(b));
System.out.println(a.hashCode());
System.out.println(b.hashCode());
}
}
运行结果:
此例说明,String对象重写了equals()方法以及hashcode()方法,查看源代码可知确实如此;