---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
equals和==的區別?
經常被簡單的理解爲equals方法用來比較兩個對象是否相同,
而==比較運算符用來比較兩個基本數據類型的數值是否相同。
這樣的理解無可厚非,但還要透過簡單看看本質,纔會更清晰。
1,基本數據類型的值。
int x = 3;
int y = 3;
System.out.println(x==y);//true
對於基本數據類型的值只能用 == 比較運算符進行比較是否相等。
那麼對於引用數據類型呢?
2,引用數據類型的比較。
Demo d1 = new Demo();
Demo d2 = new Demo();
System.out.println(d1==d2);//比較的是d1和d2的內存地址是否相等。
System.out.println(d1.equals(d2));//Demo類繼承了Object類中的equals方法
兩條輸出語句的結果都是false,爲什麼?
第一句原因:
用new操作符創建的對象都會在內存中分配一個新的內存地址。
所以兩個對象的內存地址不同,爲false。
第二句原因:
必須明確equals到底比較的是對象的什麼?查看Object類的equals方法源碼:
public boolean equals(Object obj) {
return (this == obj);
}
發現內部使用的也是 == 運算符比較的。
所以在對象的比較相同上 == 和equals是一樣的。
那有的同學就問了,那equals方法還有什麼用呢?
雖然每個對象都有自己的內存地址,但是每個對象也有自己的一些特有的特徵。
比如學生對象有自己的姓名和年齡,希望根據姓名和年齡的相同來判斷學生對象是否相同。
這時使用Object類的equals就不能滿足需求了,
就需要通過覆蓋equals的方式,建立學生對象比較相同的具體內容。
public boolean equals(Object obj){
if(姓名和年齡相同)
return true;
return false;
}
Student s1 = new Student("zhangsan",20);
Student s2 = new Student("zhangsan",20);
System.out.println(s1==s2); //結果是false,比較兩個對象的地址。
System.out.println(s1.equals(s2));//結果是true,比較的是對象的具體內容。
所以,在用Java的類描述對象的時候,如果要判斷該對象是否相同時,通常都會
覆蓋equals方法,建立根據該對象特徵進行比較相同的依據。
這也就是大家常聽到的“equals是用來比較對象內容”的原因。
Java中很多對象都覆蓋了equals方法,建立該對象特有的比較相同的方式。
比如String,Integer,Boolean等。
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net