重写equals()时需要同时重写hashcode()

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()方法,查看源代码可知确实如此;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章