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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM