在實際編程中,常常會須要比較兩個值或兩個對象是否相等(相同),這時咱們一般會使用==
或equals
。那麼它們各自表明着什麼含義,又有什麼區別呢?今天來總結一下。html
==
有兩種狀況:數據是基本類型,或引用類型(即對象)java
==
比較的是值==
比較的是所引用的對象是不是同一個,即指向的內存地址
是否相同下面看測試代碼:python
private static void main(String[] args) {
int a1 = 10;
int a2 = 10;
System.out.println(a1 == a2);
double d1 = 6.7;
double d2 = 6.7;
System.out.println(d1 == d2);
boolean b1 = true;
boolean b2 = true;
System.out.println(b1 == b2);
char c1 = 'x';
char c2 = 'x';
System.out.println(c1 == c2);
}
複製代碼
測試結果:編程
true
true
true
true
複製代碼
equals
方法首先咱們要理解,這個equals方法是咱們要比較的對象所屬的類從超類Object一層一層繼承過來的。那麼咱們先看一下Object類中的源碼:bash
public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
}
複製代碼
哦,原來Object類的這個equals方法用的是==啊。那爲何String對象的equals方法竟然能比較兩個不一樣的對象相等呢?咱們看下String類的源碼:測試
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
類重寫了Object
類的equals
方法,使用equals
比較String
對象變成了比較每個字符的值,因此值
相同的String對象纔會相等
。this
所以,在使用equals
比較引用類型時,若是這個對象所屬的類重寫了equals
方法,就按照這個規則來斷定。若是沒有重寫,那麼就按照Object
類的equals
方法判斷——也就是與==
號相同了。spa
注:基本數據類型與引用類型不一樣,它不屬於任何類,也就沒有equals
方法了。code
下面看測試代碼:htm
package com.eknown.basic;
/** * @author zfh * @version 1.0 * @since 2019/5/16 9:28 */
public class EqualsTest {
public static void main(String[] args) {
// 測試重寫了equals方法的String類對象
System.out.println("測試重寫了equals方法的String類對象");
String str1 = new String("abc"); // 注意:String str = "abc"和 str = new String("abc")是不一樣的。
String str2 = new String("abc");
String str3 = new String("gcc");
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
// 測試未重寫equals方法的User對象
System.out.println("測試未重寫equals方法的User對象");
User user1 = new User(1, "java");
User user2 = new User(2, "python");
System.out.println(user1.equals(user2));
System.out.println(user1 == user2);
user2 = user1;
User user3 = user1;
System.out.println(user2.equals(user3));
}
}
複製代碼
public class User {
private Integer id;
private String name;
User(Integer id, String name) {
this.id = id;
this.name = name;
}
// ... getters and setters
}
複製代碼
運行結果:
測試重寫了equals方法的String類對象
true
false
測試未重寫equals方法的User對象
false
false
true
複製代碼
參考:
- Matrix海子——淺談Java中的equals和==