Java 中的 ==, equals 的区别

时间:2022-01-24 14:11:32

概念:

    == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系

    equals : Object的实例方法,比较两个对象的content是否相同

关系操作符==

    基本数据类型变量

    对于基本数据类型变量,变量直接存储的是“值”,使用关系操作符来进行比较时,比较的就是“值”本身

    引用类型变量

    在Java中,引用类型的变量存储的并不是“值”本身,而是与其指向的对象在内存中的地址(关于对象引用的内容,不了解请查看这篇博客:https://blog.csdn.net/lxl121181/article/details/80483657

所以关系操作符判断的是左右两边操作数的内存地址是否相同,若返回true,则该操作符作用的一定是同一个对象

equals方法

    Java语言里的euqals方法其实是交给开发者去覆写的,让开发者自己去定义满足什么条件的两个Object是euqal的

    所以我们不能单纯的说euqals到底比较的是什么。你想知道一个类的equals方法是什么意思就要去看定义


    Object类中equals方法实现如下:

public boolean equals(Object obj) {
    return (this == obj);
}

很显然,在Object类中,equals方法时用来比较两个对象的引用是否相等,即是否指向同一个对象

而String类则覆写了这个方法

public boolean equals(Object anObject) {   
    if (this == anObject) {     // 1.先判断引用是否相同(是否为同一对象),
        return true;
    }
    if (anObject instanceof String) {   //2. 再判断类型是否一致,
        // 3.最后判断内容是否一致.
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
}

Java语言规范要求euqals方法具有下面的特性:

  • 对称性: 对于任何引用x和y,当且仅当x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true” ;

  • 自反性: 对于任何非空引用x,x.equals(x)应该返回“true” ;

  • 传递性对于任何引用x和y,如果x.equals(y)返回是“true”,y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true” ;

  • 一致性: 如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果

  • 对于任意非空引用x,x.equals(null)应该返回false。