在比較兩個對象或者數據大小的時候,常常會用到==、compareTo()和equals(),尤爲是在接入了Comparable接口後重寫compareTo方法等場景,因此咱們來理一下這三個的區別。this
1.等號——"==":
等號是最簡單也最容易理解的,若是等號的兩邊是基本數據類型,好比int,double,那麼等號就用來單純的比較他們的數值大小
若是等號兩邊放的是兩個對象,那麼就會比較他們在內存當中的地址。
例如:對象
String a="abc";
String b="abc";
System.out.println(a==b);
1
2
3
答案是: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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
能夠觀察出,這裏其實是獲取的字符串(也能夠是其餘對象)的長度,而後做減法,這裏的減法就是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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
能夠觀察出,equals是先用等號(==)直接來比較兩個對象在內存當中的地址,若是相等會直接返回true,若是這兩個對象的地址不同,就會考慮這兩個對象是否是String類型的,若是是String類型的,那先比較兩個字符串長度是否同樣,若是長度不一致,那100%不相等,直接返回false。長度一致則逐個比較方法
4.compareTo()和equals的區別compareTo()會返回兩者的差值,即返回的是一個數字;而equals就簡單一些,只返回true或者false。最後,compareTo()和equals()均可以判斷其餘基本數據類型,好比說Integer,Java的源碼中對這二者方法都作了一些重載,能夠根據參數的類型去自動匹配相應的方法,他們的原理也很是簡單,只是一些簡單的減法或者(?:)這類判斷。---------------------