欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一篇搞懂==,===,equals()

程序员文章站 2024-02-04 08:22:16
...

==

==是比较运算符,==比较的是对象的地址,也就是判断是否为同一个对象;

或者这么说吧:

当比较基本数据类型时,==就是比较值是否相等

当比较引用数据类型时,例如比较两个对象的引用时,==比较的就是引用变量的地址是否相同

 

===

“===”一般在JS中使用,用于判断左右两个操作数是否严格相同,比较原则比“==”更严格,“===”既比较内容,又比较数据类型。

这里主要注意两点:

(1)如果类型不同,就一定不相等(返回false)

(2)如果比较对象中有至少一个是NaN,那么一定不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)

其他情况下(如字符串、null、undefined、数值型等)就是判断左右两侧是否数据类型相同并且数据值完全相同。

 

equals()

equals()是方法,不是运算符在Java中,所有类都继承了Object类。而在Object类中,equals()方法是这么定义的

//equals方法的实现原理
public boolean equals(Object obj) {
    return (this == obj)
}

其实,在原生的Object类中,equals()方法的实现也是依靠"=="实现的,所以原生的equals()和"=="并无差别

但是很多类都会重写equals()方法,重写之后equals()方法就不和"=="相同了,例如在String.java源文件中,String类的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;
    }

在String类中,equals()方法判断条件如下:

1)若当前对象和比较的对象是同一个对象(用"=="判断的),即返回true。实际上这就是Object中的equals方法。

2) 若当前传入的对象是String类型,则比较两个字符串的长度(value.length)。若长度不相同,返回 false。若长度相同,则按照数组value中的每一位进行比较,每一位都相同返回true,有不同时返回false。

3)若当前传入的对象不是String类型,则直接返回false。

所以最终重写后,equals()方法比较的其实是值(内容)是否相等,而不是内存地址是否相等了。除了String以外,Java中大部分类都重写了equals方法,比如包装类Integer,Double,Long等。

在我们日常使用中,如果要比较两个引用是否指向同一个对象(内存地址是否相同),应该用 "==" 比较 ,如果想比较内容是否相等可以尝试使用equals()方法,当然可以自己重写equals()方法,自己写的话可以更符合自己的需求变化,想怎么比就怎么比。

 

==  和equals()的区别

5.1 比较八种基本数据类型时,要使用"==",不能用equals(),此时“==”比较的是左右两边的值是否相等。

       八种基本数据类型:byte、int、short、long、char、float、double、boolean

5.2 比较包装类型时,“==” 比较的是内存地址是否相等,而equals()比较的是值是否相等(在日常使用中最常用到比较String是否相等,这里要用equals方法去比,不能用"==")。

 

实例

举一些例子便于理解。

String s1 = "RoRoBear";
String s2 = "RoRoBear";
String s3 = "RoRoBea";
String s4 = "r";
String s5 = s3 +s4;
String s6 = s3+"r";
String s7 = new String("RoRoBear");
String s8 = new String("RoRoBear");

System.out.println(s1 == s2);  //true
System.out.println(s1.equals(s2));  //true

System.out.println((s1 == s5));  //false
System.out.println(s1.equals(s5));  //true

System.out.println(s1 == s6);  //false
System.out.println(s1.equals(s6));  //true

System.out.println(s1 == s7);  //false
System.out.println(s1.equals(s7));  //true

System.out.println(s5 == s6);  //false
System.out.println(s5.equals(s6));  //true

System.out.println(s5 == s7);   //false
System.out.println(s5.equals(s7));   //true

System.out.println(s7 == s8);  //false
System.out.println(s7.equals(s8));  //true

 

相关标签: == === equals