從剛學java起,對於==與euqal()之間的區別就一直模糊不清,搞了又搞,一直搞不明白,今天決定徹底搞懂。。。。
參考博客:http://www.cnblogs.com/pop822/p/6215040.html
http://www.jb51.net/article/73949.htm
問題分析:(1)==與equal()各自的作用
(2)與引用數據類型,基本數據類型綜合以后應該怎么分析
(3)項目中使用應該注意什么
作用:== 操作比較的是兩個變量的值是否相等,對於引用型變量表示的是兩個變量在堆中存儲的地址是否相同,即棧中的內容是否相同。
equals操作表示的兩個變量是否是對同一個對象的引用,即堆中的內容是否相同。
==一般用在基本數據類型中,equals()一般比較字符串是否相等
比如:
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
原來,程序在運行的時候會創建一個字符串緩沖池當使用 s2 = "Monday" 這樣的表達是創建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創建的時候,程序找到了具有相同值的 s1
將s2引用s1所引用的對象"Monday"
第二段程序中,使用了 new 操作符,他明白的告訴程序:"我要一個新的!不要舊的!"於是一個新的"Monday"Sting對象被創建在內存中。他們的值相同,但是位置不同,一個在池中游泳一個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什么呢?
結論:要想判斷兩個對象是否相等,不能通過比較兩個對象的引用是否相等,這是永遠都得不到相等的結果的,因為兩個對象的引用永遠不會相等,所以正確的比較方法是直接比較這兩個對象,比較這兩個對象的實質是不是一樣的,即這兩個對象里面的內容是不是相同的,通過比較這兩個對象的屬性值是否相同而決定這兩個對象是否相等。
所以通過重寫類中的equal()方法
一般我們在設計一個類時,需要重寫父類的equals方法,在重寫這個方法時,需要按照以下幾個規則設計:
1、自反性:對任意引用值X,x.equals(x)的返回值一定為true.
2、對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;
3、傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4、一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變
5、非空性:任何非空的引用值X,x.equals(null)的返回值一定為false
equas()與==就這么多,忘了就來看看,應該就能理解