面向对象集|每日一题:==和equals的区别?

241 阅读2分钟

参考回答: == 和 equals,都是用来比较是否相等的。

其中,== 是比较值是否相等,这里要区分两种情况:

如果要比较的是两个基本数据类型变量,那么要比较的值指的就是具体内容。

int num1 = 10;
int num2 = 10;
// 是对10和10的比较
System.out.println(num1 == num2); // true

如果要比较的是两个引用数据类型变量,那么要比较的值指的就是变量中存储的引用地址值。

Student stu1 = new Student(1, "张三");
Student stu2 = new Student(1, "张三");
// 是对两个变量存储的对象地址值比较,而不是比较1、张三这种内容
System.out.println(stu1 == stu2); // false

equals 方法是定义在 Object 类中的,因为 Java 中所有的类都继承自 Object 类,所以每个 Java 类都有该方法,在 Object 类中这个方法的默认实现就是使用 == 来比较的。

public class Object {
    // ...
    public boolean equals(Object obj) {
        return (this == obj);
    }
    // ...
}
Student stu1 = new Student(1, "张三");
Student stu2 = new Student(1, "张三");
// 是对两个变量存储的对象地址值比较,而不是比较1、张三这种内容
System.out.println(stu1.equals(stu2)); // false

如果想用 equals 方法来比较两个对象存储的内容,那么对应的类需要重写 equals 方法,像 String 类型之所以可以用 equals 方法来比较存储的字符内容,就是因为它重写了 equals 方法。

public boolean equals(Object anObject) {
    // 判断要比较的两者是不是同一个对象
    if (this == anObject) {
        return true;
    }
    // 判断要比较的另一方是不是字符串类型
    if (anObject instanceof String) {
        // 将另一方向下类型转换为字符串类型
        String anotherString = (String)anObject;
        // 判断两个字符串的长度是不是相等
        int n = value.length;
        if (n == anotherString.value.length) {
            // 获取两个字符串内部的两个字符数组(字符串内部通过字符数组存储内容)
            char v1[] = value;
            char v2[] = anotherString.value;
            // 循环遍历两个字符数组,比较每一个字符
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}