Java对象的Equals()方法的介绍

326 阅读4分钟

个人总结:如果你想用equals方法去比较两个对象的值是否相等必须要重写对象的equals()方法,如果你不重写就会调用Object里面的equals方法;而Object里面的equals方法等价于 ==,我们都知道,==对于基本数据类型是判断值是否相等;而对于对象,则是判断地址是否相同。所以想要判断对象是否相等,我们必须重写对象的equals方法。

1、equals()方法介绍

image.png

2、通过下面的例子掌握Equals的用法

package p0930Equals;

/**
 * @author: jdq8576
 * @date: 2021-09-30 09:19
 **/
public class EqualsTest {
    public static void main(String[] args) {
        /**
         * 这里使用构造方法Cat()在堆内存里面new 出来了两只猫
         * 这两只猫的color、weight、height都是一样的
         * 但c1 和 c2 却永远不会相等,这是因为c1 和 c2分别为堆内存里面两只猫的引用对象
         * 里面装着可以找到这两只猫的地址,但由于两只猫在堆内存里面存储在两个不同的空间里面
         * 所以 c1 和 c2分别装着不同的地址,因此c1 和 c2 永远不会相等
         */
        Cat c1 = new Cat(1, 1, 1);
        Cat c2 = new Cat(1, 1, 1);
        System.out.println("c1 == c2的结果是:" + (c1 == c2)); // false
        System.out.println("c1.equals(c2)的结果是:" + c1.equals(c2)); // false
    }

    static class Cat {
        int color, weight, height;

        public Cat(int color, int weight, int height) {
            this.color = color;
            this.weight = weight;
            this.height = height;
        }
    }
}

3、画出内存图分析c1和c2比较的结果

程序:

Cat c1 = new  Cat(1,1,1);

Cat c2 = new  Cat(1,1,1);

执行完之后内存之中的布局如下图所示:

image.png

c1指向一个对象,c2也指向一个对象,c1和c2里面装的是这两只Cat对象在堆内存里面存储的地址,由于这两只Cat对象分别位于不同的存储空间,因为c1和c2里面装着的地址肯定不相等,因此c1和c2这两个引用对象肯定不相等。因此执行System.out.println("c1 == c2的结果是:" + (c1 == c2));打印出来的结果肯定是false。因此你new出来了两个对象,你放心,这两个对象的引用永远不一样,一样的话就会把其中一个给覆盖掉,这个可不成。

要想判断两个对象是否相等,不能通过比较两个对象的引用是否相等,这永远都得不到相等的结果的,因为两个对象的引用永远不会相等。所以正确的比较方法是直接比较这两个对象,比较这两个对象的实质是不是一样的,即这两个对象里面的内容是不是相同的,通过比较这两个对象的属性值是否相同而决定这两个对象是否相等。

Object类提供了一个equals()方法来比较两个对象的内容是否相同,因为我们可以采用这个方法去比较两个对象是否在逻辑上"相等",如:c1.equals(c1)这里是调用从Object类继承下来的equals()方法,通过查阅API文档得到Object类里面的equals方法的定义如下:

public boolean equals(Object obj)

在Object这个类里面提供的equals()方法默认的实现是比较当前对象的引用和你要比较的那个引用它们指向的是否是同一个对象,即和c1==c2这种写法是一样的,c1.equals(c2)c1==c2是完全等价的。因此直接使用继承下来的equals()方法也是无法直接比较两个对象的内容是否相同的,为此,我们必须重写equals()方法,改变这个方法的默认的实现。

下面在Cat类里面重写这个继承下来的equals()方法:

package p0930Equals;

import java.util.Objects;

/**
 * @author: jdq8576
 * @date: 2021-09-30 09:19
 **/
public class EqualsTest {
    public static void main(String[] args) {
        
        Cat c1 = new Cat(1, 1, 1);
        Cat c2 = new Cat(1, 1, 1);
        System.out.println("c1 == c2的结果是:" + (c1 == c2)); // false
        System.out.println("c1.equals(c2)的结果是:" + c1.equals(c2)); // true
        
    }

    static class Cat {
        int color, weight, height;

        public Cat(int color, int weight, int height) {
            this.color = color;
            this.weight = weight;
            this.height = height;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Cat cat = (Cat) o;
            return color == cat.color && weight == cat.weight && height == cat.height;
        }

        @Override
        public int hashCode() {
            return Objects.hash(color, weight, height);
        }
    }
}