Java中“==”、“compareTo()”和“equals()”的区别

在比较两个对象或者数据大小的时候,经常会用到==、compareTo()和equals(),尤其是在接入了Comparable接口后重写compareTo方法等场景,所以我们来理一下这三个的区别。

1.等号——"==":

等号是最简单也最容易理解的,如果等号的两边是基本数据类型,比如int,double,那么等号就用来单纯的比较他们的数值大小
如果等号两边放的是两个对象,那么就会比较他们在内存当中的地址。
例如:

	   String a="abc";
		String b="abc";
		System.out.println(a==b);

  

答案是:true
因为相同的字符串内容,在地址上是一样。在Java中,String是有一个String pool的,里面存放了可以共享的字符串对象,在声明一个String对象后,会首先去找是否存在相同的String内容,如果有的话是不会创建新的对象的。在这里b实际上是引用了a的对象的值,他自己并没有创建对象,所以这里的答案是true。

但是如果我们接着
String c=new String(“abc”);

System.out.println(a==c);
那答案就是false,因为这二者的地址并不是一致的。

2.compareTo()

在Java里观察compareTo()的源码

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

  

可以观察出,这里实际上是获取的字符串(也可以是其他对象)的长度,然后作减法,这里的减法就是ASCII码的减法,所以compareTo()会返回数字,如果两个字符串内容相同,会返回0,字符串a大于字符串b,会返回相差的ASCII码的正数,字符串a小于字符串b,会返回相差的ASCII码的负数。

所以 System.out.println(a.compareTo(b))的答案是:0

3.equals()

依旧是来观察Java中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;
}

  

可以观察出,equals是先用等号(==)直接来比较两个对象在内存当中的地址,如果相等会直接返回true,如果这两个对象的地址不一样,就会考虑这两个对象是不是String类型的,如果是String类型的,那先比较两个字符串长度是否一样,如果长度不一致,那100%不相等,直接返回false。长度一致则逐个比较

4.compareTo()和equals的区别

compareTo()会返回二者的差值,即返回的是一个数字;而equals就简单一些,只返回true或者false。
最后,compareTo()和equals()都可以判断其他基本数据类型,比如说Integer,Java的源码中对这两者方法都做了一些重载,可以根据参数的类型去自动匹配相应的方法,他们的原理也非常简单,只是一些简单的减法或者(?:)这类判断。


原文:https://blog.csdn.net/qq_43576028/article/details/90347117

上一篇:物化视图如何快速完成数据聚合操作?


下一篇:Unity中确定时间是否在一定范围内