victory的博客

长安一片月,万户捣衣声

0%

Java | Java判断对象是否相等

Java判断对象是否相等

1.类的创建

要判断两个对象是否相等,我们首先得创建相应得类并由此类创建两个对象;此处我们定义一个Monkey类,该类
包含两个属性:name 和 age;同时我们为类中得实例变量添加了构造器、getter和setter方法。

class Monkey{
    private String name;
    private int age;
    
    public Monkey(String name, int age){
        this.setName(name);
        this.setAge(age);
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Java中如何判断两个对象是否相等

Java通过hashCode()和equals的结果共同决定两个对象是否相等

hashCode()

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。
这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK
的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。

equals()

equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,
比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,
价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java
中的任何类都包含有equals()函数。
注意:通常我们可以通过重写hashCode()和equals()来自定义两个对象相等的标准,且若重写,
必须同时对两个方法进行重写。

重写hashCode()和equals()

我们只需再上面定义的Monkey类中重写这两个方法即可;equals方法直接返回true,也就是说对
这个类产生的任意两个对象进行比较都会返回ture;hashCode()方法返回一个固定的值,这里取4。

class Monkey{
    ...
    
    public boolean equals(Object obj) {
        return true;
    }
    
    public int hashCode() {
        return 4;
    }
    
    ...
}

写测试类

下面我们创建一个HashCodeAndEqualsTest测试类进行测试。

public class HashCodeAndEqualsTest {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Monkey monkey1 = new Monkey("wu kong", 10);
        Monkey monkey2 = monkey1;
        Monkey monkey3 = new Monkey("liu er",  5);
        
        System.out.println("monkey1's name:" + monkey1.getName() + ",age:" + monkey1.getAge());
        System.out.println("monkey2's name:" + monkey2.getName() + ",age:" + monkey2.getAge());
        System.out.println("monkey3's name:" + monkey3.getName() + ",age:" + monkey3.getAge());
        
        System.out.println("monkey1's hash code:" + monkey1.hashCode());
        System.out.println("monkey2's hash code:" + monkey2.hashCode());
        System.out.println("monkey3's hash code:" + monkey3.hashCode());
        
        System.out.println("Is monkey1 equal to monkey2:" + monkey1.equals(monkey2));
        System.out.println("Is monkey1 equal to monkey3:" + monkey1.equals(monkey3));
    }

}

1.没有重写方法的程序执行结果

monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:366712642
monkey2's hash code:366712642
monkey3's hash code:1829164700
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:false

monkey1和monkey2指向堆上的同一个对象,故monkey1.equals(monkey2)的结果为true,monkey1和
monkey3指向堆上两个不同的对象,故equals()方法返回false。

2.重写后的程序执行结果

monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:4
monkey2's hash code:4
monkey3's hash code:4
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:true

由于我们对equals和hashCode方法进行了重写,重新确定了对象相等的标准,故monkey1和monkey3为
“同一对象”。

3.只重写equals方法时,程序的执行结果

monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:366712642
monkey2's hash code:366712642
monkey3's hash code:1829164700
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:true

重写了equals方法后,monkey1和monkey3两个对象被认为指向同一实例,但他们的hash code不同

4.只重写hashCode方法时,程序的执行结果

monkey1's name:wu kong,age:10
monkey2's name:wu kong,age:10
monkey3's name:liu er,age:5
monkey1's hash code:4
monkey2's hash code:4
monkey3's hash code:4
Is monkey1 equal to monkey2:true
Is monkey1 equal to monkey3:false

虽然monkey1、monkey2的hash code相同,但equals方法返回false。