首先我們先看三個例項結果:
例項1:
string s1 = new string("abc");
string s2 = new string("abc");
s1==s2——結果為false;
s1.equals(s2)——結果為true;
例項2:
object obj1 = new object();
object obj2 = new object();
obj1==obj2;
obj1.equals(obj2);
結果都為false;
示例3:
object obj1 = new object();
object obj2 = obj1;
obj1==obj2;
obj1.equals(obj2);
結果都為true;
看到這三種結果,雖然大家都知道這個結果,初學者可能難免都會產生一種說不清道不明感覺,下面是個人對==和equals兩種比較操作的理解,不對之處也請各們高手指正,以免我誤道初學者。
首先我來解說示例1:
先讓我們來看看string類equals方法的原始碼:
public boolean equals(object anobject)
if (anobject instanceof string)
return true;}}
return false;
}
如上**所示,equals方法的第一步就是進行==比較,而我們知道,兩個string型別的==比較結果是false,所以我們繼續往下看**,當==結果為false時,並且比較型別為string時,就會把兩個string轉化為char陣列,通過比較char陣列中的每個值來判斷最終結果。
再先我來解說示例2:
還是讓我們先看一段object類equals方法的原始碼:
public boolean equals(object obj)
**所示,當兩個物件型別進行equals方法比較時,預設是進行==比較
object obj1 = new object();
object obj2 = new object();
如果obj1與obj2兩個物件中的值完全一樣,為什麼他們的==和equals都會返回false呢?想不通,不急,不妨看看我說的對不對
建立乙個物件型別,如object obj = new object();在jvm中會開闢兩塊記憶體,一塊為obj,在這我稱之為變數記憶體(儲存在棧中),一塊為new object();在這裡我稱之為物件記憶體(儲存在堆中);而變數僅僅只是物件的乙個引用而已。
在上面的示例中我們建立了obj1與obj2兩個變數,分別在jvm中開闢了兩塊記憶體,同時並具有唯一記憶體位址,而當物件型別使用==進行比較時,恰恰就是比較的這兩個物件的記憶體位址值(記憶體位址的其中一種表示形式就是hashcode值),所以物件型別的==結果為false。又因為object的equals預設就是進行==比較,所以物件型別的equals返回結果也是false;
有了示例2的解說,相信大家對示例3的結果應該會比較清楚了,因為obj2=obj1,意味著new object()不僅被obj1變數引用,同時還被obj2變數引用,所以,這兩個變數指向同一塊記憶體物件,所以他們的==和equals都為true。
簡言之:
當比較的雙方為基本資料型別時,==比較的是雙方的值。
當比較的雙方為物件資料型別時,==和equals都比較的是雙方的變數所指向物件(值)的記憶體位址。
而通過示例1我們可以得出,引用型別的equals比較的是兩個物件的內容是否相等。
所以我們在判斷兩個物件是否相等時,需要重寫equals方法逐個判斷物件中的內容是否相等。
所以使用使用物件clone出來的物件,雙方==和equals也還是false,因為當我們clone物件時,仍然是返回乙個new object(),源object與clone出的object具有不相同的記憶體位址。
java中equals()與 區別
int a 10 int b 10 則a b將是true。但不好理解的地方是 string a new string foo string b new string foo 則a b將返回false。物件變數其實是乙個引用,它們的值是指向物件所在的記憶體位址,而不是物件本身。a和b都使用了new操作...
java中「 」 與 equals 區別
首先這是乙個很經典的例子,我們可以編寫乙個簡單的例子如下 有上述例子我們可以知道,是比較的我們資料位址,而equals則比較的是資料內容,a b,因為a,b為常量在常量池中為同意資料塊,所以相等,a1,b1是不同物件,在堆中儲存在不同區域,位址不同,所以a1 b1為false 那麼有些就奇怪了,為什...
java中equals 與 比較
1.對於 如果作用於基本資料型別的變數,則直接比較其儲存的 值 是否相等 如果作用於引用型別的變數,則比較的是所指向的物件的位址 2.對於equals方法 注意 equals方法不能作用於基本資料型別的變數 如果沒有對equals方法進行重寫,則比較的是引用型別的變數所指向的物件的位址 諸如stri...