參考博客: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()方法

一般我們在設(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
