黑馬程序員---- java中 equals 和 ==的區別

---------------------- 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


發佈了35 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章