在java中,我們通常使用==或者equlas去判斷兩個變量是否相等。
1.==
當判斷兩個基本數據類型(int,long...)的是否相等的時候,不需要兩個變量數據類型相同,只要值相等就返回true。
eg:
int i = 65;
float f = 65.0f;
char c = 'A';
System.out.println(i == f);
System.out.println(i == c);
System.out.println(c == f);
他們的返回值都爲true
當兩個引用類型的變量,使用==進行比較的時候,兩個變量必須指向同一個對象時才返回true
eg:
Person p = new Person("孫悟空");
Person p2 = p;
System.out.println(p == p2); //此時返回true
Person p1 = new Person("hello java");
Person p2 = new Person("hello java");
System.out.println(p1 == p2); //此時返回false,因爲在堆中new了兩個Person對象,即使他們的值都爲hello java,但是他們的內存地址不一樣。
2.equals
基本數據類型不能通過equals方法來進行比較,equals方法是Object中的一個方法,必須通過引用變量來調用。
String str1 = new String("hello java");
String str2 = new String("hello java");
System.out.println(str1 == str2); //false
System.out.println(str1.equals(str2));//true
上學的時候大家肯定都看過這樣的代碼,當時的理解是equals是比較變量的值,現在發現這個是錯誤的,String類中重寫了equals方法,使他在這種情況下根據值判斷返回了true,實際上equals如何判斷,都掌握在自己手裏面,此處的String自己封裝好了,是一個特殊的例子。
一般我們重寫equals方法會這麼寫:
public boolean equals(Object obj){
if(obj != null && obj instanceof Person){
Person p = (Person)obj;
//根據特定的屬性判斷,此處假設存在年齡這個屬性
if(this.getAge() == p.getAge())
return true;
}
return false;
}
但是此處存在一點問題,主要是instanceof,當instanceof前面的對象是instanceof後面類的實例,或者子類實例時,都返回true,這就會帶來一些問題。
下面提供一段比較好的重寫equals的代碼:
public boolean equals(Object obj){
//當equals前後是同一對象的時候,返回true
if(this == obj)
return true;
if(obj != null && obj.getClass() == Person.class){
Person p = (Person)obj;
//根據特定的屬性判斷,此處假設存在年齡這個屬性
if(this.getAge() == p.getAge())
return true;
}
return false;
}
這裏面用到了java反射裏面的知識。