equals和==

參考博客:http://www.cnblogs.com/pop822/p/6215040.html

http://www.jb51.net/article/73949.htm

值類型是存儲在內(nèi)存中的堆棧(以后簡稱棧),而引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身則存儲在堆中。
作用:
== 操作比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內(nèi)容是否相同。
equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的內(nèi)容是否相同。
==一般用在基本數(shù)據(jù)類型中,equals()一般比較字符串是否相等
equals()方法在object類中定義如下

public boolean equals(Object obj) {  
    return (this == obj);  
}  

例子:

        String a = new String();
        String b = new String();
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(a == b));//false
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(a.equals(b)));//true

        Abc a = new Abc();
        Abc b = new Abc();
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(a == b));//false
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(a.equals(b)));//false

        Abc c = b;
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(c == b));//true
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(c.equals(b)));//true

        String s1 = "";
        String s2 = new String();
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(s1 == s2));//false
        Log.e(TAG, "LoginActivity: "+ Boolean.toString(s1.equals(s2)));//true
String s1 = "Monday";
String s2 = "Monday";
s1==s1 //true,因為s1,s2的值均存放在常量池中,s1,s1在棧中存放常量池中位置相同

String s1 = "Monday";
String s2 = new String("Monday");
s1==s2;    //false
s1.equals(s2);   //true

原來,程序在運行的時候會創(chuàng)建一個字符串緩沖池當(dāng)使用 s2 = "Monday" 這樣的表達是創(chuàng)建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創(chuàng)建的時候,程序找到了具有相同值的 s1

將s2引用s1所引用的對象"Monday"
第二段程序中,使用了 new 操作符,他明白的告訴程序:"我要一個新的!不要舊的!"于是一個新的"Monday"Sting對象被創(chuàng)建在內(nèi)存中。他們的值相同,但是位置不同,一個在池中游泳一個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什么呢?

結(jié)論:要想判斷兩個對象是否相等,不能通過比較兩個對象的引用是否相等,這是永遠都得不到相等的結(jié)果的,因為兩個對象的引用永遠不會相等,所以正確的比較方法是直接比較這兩個對象,比較這兩個對象的實質(zhì)是不是一樣的,即這兩個對象里面的內(nèi)容是不是相同的,通過比較這兩個對象的屬性值是否相同而決定這兩個對象是否相等。

  所以通過重寫類中的equal()方法

image

    一般我們在設(shè)計一個類時,需要重寫父類的equals方法,在重寫這個方法時,需要按照以下幾個規(guī)則設(shè)計:
    1、自反性:對任意引用值X,x.equals(x)的返回值一定為true.
    2、對稱性:對于任何引用值x,y,當(dāng)且僅當(dāng)y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;
    3、傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
    4、一致性:如果參與比較的對象沒任何改變,則對象比較的結(jié)果也不應(yīng)該有任何改變
    5、非空性:任何非空的引用值X,x.equals(null)的返回值一定為false

image

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容