先說」==」:
對於基本數據類型 (byte,short,char,int,long,float,double,boolean)的變量」==」比較的是兩個變量的值是否相等。
好比:int a = 3; int b = 3; a==b;返回就是true
對於引用類型如,則比較的是該變量所指向的地址.
拿咱們最經常使用的String型來舉例:
好比:String a = 「abc」; String b = 「abc」;
在這種狀況下 字符串直接賦值給變量,該字符串會進入到常量池中,當第一次將 「abc」賦值給a的時候,會去常量池中找看有沒有」abc」這個字符串,若是有的話,就將a指向該字符串在常量池中的地址,若是沒有則在常量池中建立,第二次賦值 將 「abc」賦值給b的時候一樣去常量池中找」abc」這個字符串,而後將他的地址賦值給b.
因此咱們在作 a==b操做的時候返回的爲true
再來看另外一種狀況:String a = new String(「abc」) ; String b = new String(「abc」);
這種狀況下 建立出來的」abc」對象會被存儲到堆,a和b指向的「abc」分別存儲到堆內存的不一樣位置。a和b裏面保存的是」abc」在堆裏面的內存首地址,這兩個地址明顯是不一樣的,因此咱們在作 a==b操做的時候返回的爲falseide
再來看」equals」:
Equals方法是在Object類中定義的,全部的類都繼承於Object類,因此全部的類都有equals方法。
咱們來看看equals方法的源碼:this
public boolean equals(Object obj) {
return (this == obj);
}對象
能夠看到在Object類的equals方法中也是用的」==」來進行比較,因此在進行比較時它和」==」應該時等價的,可是爲何咱們在作 字符串比較的時候 二者比較出來的結果不同呢?
緣由就是 String類型對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;
}繼承
從源碼咱們能夠看出,在String的equals方法中對字符串的字符進行了逐一比較若是都相同則返回true.因此對於String中的equals方法比較的是兩個字符串的內容對於:
String a = new String(「abc」) ; String b = new String(「abc」);
因爲a和b的內容相同,返回true.
總結:內存