1. 程式人生 > >由equals和==不同,而引發的知識點補習

由equals和==不同,而引發的知識點補習

分享 完全 掌握 cts contain erl 地址 對象分配 作用

  在復習JavaSE基礎時,看到Object類中的equals方法與==的對比,原文中是這麽講的:“兩個內建類型的數值進行比較是否相等時,使用“==”,但當比較兩個對象的時候,可以使用“==”或equals方法,這倆方法有區別,

區別在於,equals方法比較的是引用變量指向的對象的值,==比較的是兩個對象在內存中的地址。

  內存地址、對象空間、變量......對象存在哪?變量存在哪?對象空間指的是什麽?一臉茫然 = =||

  由此,先回顧一下對象創建的概念。創建完一個類後,就創建了一種新的數據類型,可以使用這種類型來聲明該類型的對象,獲取一個類對象,一般需要兩個步驟:

  1、聲明該類類型的一個變量,它只是一個能夠引用對象的簡單變量,存儲在棧中;

  2、在堆內存中為該對象分配地址空間,並把該對象的引用賦給該變量,通過new運算完成。在java中,所有類對象,都必須動態分配。

Rectangle rectangle;
rectangle = new Rectangle(3,5);

  詳細過程如下:

(1) 執行Rectangle rectangle,系統為引用類型變量rectangle分配內存空間,此時只是定義了變量,並未進行初始化工作。

技術分享圖片

(2) 執行rectangle = new Rectangle(3,5),先調用構造方法,創建一個Rectangle類的對象,即為該對象分配內存空間,來存儲該對象的所有屬性,並對各屬性的值進行初始化,此時內存中情況如下:

技術分享圖片

(3) 接下來執行Rectangle的構造方法,繼續對新對象初始化工作,構造方法中對新構造的對象的成員變量進行賦值,width和length的值變成3和5。

技術分享圖片

(4) ==進行賦值操作,將新建的對象內存空間地址的首地址,賦值給Rectangle類型的變量rectangle

技術分享圖片

  由此,可以形象的看出變量和對象關系,回到之前討論的equals方法中。equals()和“==”操作用於對象的比較,檢查倆對象的相等性,他們倆的主要區別在於:

1、前者是方法,後者是操作符。由於Java不支持操作符重載(overloading),“==”的行為對於每個對象來說與equals()是完全相同的,但是equals()可以基於業務規則的不同而重寫(overridden )。

2、另一個需要註意的不同點是“==”習慣用於原生(primitive)類型之間的比較,而equals()僅用於對象之間的比較。同時初學者奮力地想找到什麽時候使用等號操作“==”,什麽時候使用equals方法。

“==”等號操作是什麽

“==”或等號操作在Java編程語言中是一個二元操作符,用於比較原生類型和對象。就原生類型如boolean、int、float來說,使用“==”來比較兩者,這個很好掌握。但是在比較對象的時候,就會與equals()造成困惑。

“==”對比兩個對象基於內存引用,如果兩個對象的引用完全相同(指向同一個對象)時,“==”操作將返回true,否則返回false。

  什麽是equals方法

  equals()方法定義在Object類裏面,根據具體的業務邏輯來定義該方法,用於檢查兩個對象的相等性。例如:兩個Employees被認為是相等的如果他們有相同的empId的話,你可以在你自己的domain對象中重寫equals方法用於比較哪兩個對象相等。equals與hashcode是有契約的(無論什麽時候你重寫了equals方法,你同樣要重寫hashcode()方法),默認的equals方法實現是與“==”操作一樣的,基於業務需求重寫equals方法是最好的實踐之一,同樣equals與compareTo保持一致也不足為奇,以至於存儲對象在Treemap或treeset集合中時,將使用compareTo方法檢查相等性,行為是一致的。

  ==與equals方法的區別

  ==與equals的主要區別是:==常用於比較原生類型,而equals()方法用於檢查對象的相等性。另一個不同的點是:如果==和equals()用於比較對象,當兩個引用地址相同,==返回true。

  equals()可以返回true或者false主要取決於重寫實現。最常見的一個例子,字符串的比較,不同情況==和equals()返回不同的結果。

字符串的比較是一個常見的情景,因為java.lang.String類重寫了equals方法,它返回true如果兩個字符串對象包含有相同的內容,但是==只有他們的引用地址相同時才返回true,下面這個例子就是通過==和equals方法分別比較兩個字符串。

 1     String personalLoan = new String("cheap personal loans");
 2     String homeLoan = new String("cheap personal loans");   
 3     //since two strings are different object result should be false boolean result = personalLoan == homeLoan;
 4     System.out.println("Comparing two strings with == operator: " + result);   
 5     //since strings contains same content , equals() should return true result = personalLoan.equals(homeLoan);
 6     System.out.println("Comparing two Strings with same content using equals method: " + result);
 7     homeLoan = personalLoan; 
 8     //since both homeLoan and personalLoand reference variable are pointing to same object 
 9     //"==" should return true result = (personalLoan == homeLoan); 
10     System.out.println("Comparing two reference pointing to same String with == operator: " + result);   
11     Output: 
12     Comparing two strings with == operator: false 
13     Comparing two Strings with same content using equals method: true 
14     Comparing two reference pointing to same String with == operator: true

==與equals在對象之間的對比

另一中情景是:當你對比兩個對象時,在選擇==和equals方法中很容易困惑,當你比較的兩個引用指向的對象是Object的類型的時候,那麽你看到的結果和==是一致的,因為默認的equals方法實現僅僅比較的內存地址。

如果兩個引用變量完全指向的是同一個對象的話就返回true,下面這個例子是equals和==方法操作比較的是兩個對象。

 1 Object obj1 = new Object(); Object obj2 = new Object();   
 2 // == should return false result = (obj1==obj2); 
 3 System.out.println("Comparing two different Objects with == operator: " + result);   
 4 //equals should return false because obj1 and obj2 are different result = obj1.equals(obj2); 
 5 System.out.println("Comparing two different Objects with equals() method: " + result);   
 6 // "==" should return true because both obj1 and obj2 points same object obj1=obj2; result = (obj1==obj2); 
 7 System.out.println("Comparing two reference pointing to same Object with == operator: " + result);   
 8 Output: 
 9 Comparing two different Objects with == operator: false 
10 Comparing two different Objects with equals() method: false 
11 Comparing two reference pointing to same Object with == operator: true

總結:

  1. 使用==比較原生類型如:boolean、int、char等等,使用equals()比較對象。
  2. ==返回true如果兩個引用指向相同的對象,equals()的返回結果依賴於具體業務實現
  3. 字符串的對比使用equals()代替==操作符

以上就是關於equals方法和==操作符的區別,其主要的不同是一個是操作符一個是方法,==用於對比原生類型而equals()方法比較對象的相等性。

由equals和==不同,而引發的知識點補習