這道題是來自牛客網的一位小哥在2019的最後一天面試系統開發工程師的補招的一個面試題目,可以看出這個題目還是比較基礎。不過還是有很多細節需要我們去弄清楚。以後我都找一些面試真題,來分享給大家。
背景介紹
== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。
equals用來比較的是兩個對象的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。
java中的數據類型可以分爲兩類:
基本數據類型
byte,short,char,int,long,float,double,boolean
基本數據類型之間的比較需要用雙等號(==),因爲他們比較的是值
引用數據類型
接口、類、數組等非基本數據類型
Java中的字符串String屬於引用數據類型。因爲String是一個類
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果爲true,否則比較後結果爲false。因爲每new一次就會重新開闢一個新的堆內存空間
在Object中,==和equals沒有區別
Object 類的 equals 方法實現對象上差別可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 true(x == y 具有值 true)。
==比較的是地址(是否是同一個對象)
class Students {
String name;
int age;
char sex;
public Students(String name,int age,char sex){
super();
this.name = name;
this.age = age;
this.sex = sex;
}
}
public class Test {
public static void main(String[] args) {
// s1和s2是兩個不同的對象
Students s1 = new Students("bossxiang", 23, '男');
Students s2 = new Students("bossxiang", 23, '男');
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
執行結果
false
false
在String類中(對Object中的equals方法進行了重寫)
equals 方法將此字符串與指定的對象比較。當且僅當該參數不爲 null,並且是與此對象表示相同字符序列的 String 對象時,結果才爲 true。(比較的是對象的值)
==比較的是地址(是否是同一個對象)
public class test1 {
public static void main(String[] args) {
// s1和s2是兩個不同的對象,但是內容一樣
String s1 = new String("BossXiang");
String s2 = new String("BossXiang");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
false
true
總結:
對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內存中的存放位置的地址值,跟雙等號(==)的結果相同;如果被複寫,按照複寫的要求來。
== 的作用:
基本類型:比較的就是值是否相同
引用類型:比較的就是地址值是否相同
equals 的作用:
引用類型:默認情況下,比較的是地址值,重寫該方法後比較對象的成員變量值是否相同
幾百本常用電子書免費領取:https://github.com/XiangLinPro/IT_book
It’s really hard to work hard
But always remember
It will always be difficult
if you don’t work hard
努力真的很難
但是要永遠記住
如果不努力
就會一直難