java基礎:==和equals方法區別

equals()和「==」操做用於對象的比較,檢查倆對象的相等性,可是他們倆的主要區別在於前者是方法後者是操做符。因爲java不支持操做符重載(overloading),「==」的行爲對於每一個對象來講與equals()是徹底相同的,可是equals()能夠基於業務規則的不一樣而重寫(overridden )。另外一個須要注意的不一樣點是「==」習慣用於原生(primitive)類型之間的比較,而equals()僅用於對象之間的比較。同時初學者奮力地想找到何時使用等號操做「==」,何時使用equals方法。這篇教程中你將將看到equals()方法和「==」操做是若是工做的、他們之間有什麼不一樣、何時用「==」、何時使用equals()方法。java

「==」等號操做是什麼編程

「==」或等號操做在Java編程語言中是一個二元操做符,用於比較原生類型和對象。就原生類型如boolean、int、float來講,使用「==」來比較二者,這個很好掌握。可是在比較對象的時候,就會與equals()形成困惑。「==」對比兩個對象基於內存引用,若是兩個對象的引用徹底相同(指向同一個對象)時,「==」操做將返回true,不然返回false。dom

什麼是equals方法編程語言

equals()方法定義在Object類裏面,根據具體的業務邏輯來定義該方法,用於檢查兩個對象的相等性。例如:兩個Employees被認爲是相等的若是他們有相同的empId的話,你能夠在你本身的domain對象中重寫equals方法用於比較哪兩個對象相等。equals與hashcode是有契約的(不管何時你重寫了equals方法,你一樣要重寫hashcode()方法),默認的equals方法實現是與「==」操做同樣的,基於業務需求重寫equals方法是最好的實踐之一,一樣equals與compareTo保持一致也不足爲奇,以致於存儲對象在Treemap或treeset集合中時,將使用compareTo方法檢查相等性,行爲是一致的。code

==與equals方法的區別對象

==與equals的主要區別是:==經常使用於比較原生類型,而equals()方法用於檢查對象的相等性。另外一個不一樣的點是:若是==和equals()用於比較對象,當兩個引用地址相同,==返回true。而equals()能夠返回true或者false主要取決於重寫實現。最多見的一個例子,字符串的比較,不一樣狀況==和equals()返回不一樣的結果。教程

字符串的==和equals對比內存

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

String personalLoan = new String("cheap personal loans");
String homeLoan = new String("cheap personal loans");

//since two strings are different object result should be false
boolean result = personalLoan == homeLoan;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = personalLoan.equals(homeLoan);
System.out.println("Comparing two Strings with same content using equals method: " + result);

homeLoan = personalLoan;
//since both homeLoan and personalLoand reference variable are pointing to same object
//"==" should return true
result = (personalLoan == homeLoan);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

Output:
Comparing two strings with == operator: false
Comparing two Strings with same content using equals method: true
Comparing two reference pointing to same String with == operator: true

==與equals在對象之間的對比
另外一中情景是:當你對比兩個對象時,在選擇==和equals方法中很容易困惑,當你比較的兩個引用指向的對象是Object的類型的時候,那麼你看到的結果和==是一致的,由於默認的equals方法實現僅僅比較的內存地址。若是兩個引用變量徹底指向的是同一個對象的話就返回true,下面這個例子是equals和==方法操做比較的是兩個對象。string

Object obj1 = new Object();
Object obj2 = new Object();

// == should return false
result = (obj1==obj2);
System.out.println("Comparing two different Objects with == operator: " + result);

//equals should return false because obj1 and obj2 are different
result = obj1.equals(obj2);
System.out.println("Comparing two different Objects with equals() method: " + result);

// "==" should return true because both obj1 and obj2 points same object
obj1=obj2;
result = (obj1==obj2);
System.out.println("Comparing two reference pointing to same Object with == operator: " + result);

Output:
Comparing two different Objects with == operator: false
Comparing two different Objects with equals() method: false
Comparing two reference pointing to same Object with == operator: true

總結:

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

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

相關文章
相關標籤/搜索