1. 程式人生 > >==和equals區別

==和equals區別

我們 tput 默認 等等 per 基本數據類型 har .com --

java中的數據類型,可分為兩類:
1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean
他們之間的比較,應用雙等號(==),比較的是他們的值。
2.復合數據類型(類)
當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果為true,否則比較後結果為false。 JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。


對於復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較後的結果跟雙等號(==)的結果相同。

[plain] view plain copy

  1. 1 public class TestString {
  2. 2 public static void main(String[] args) {
  3. 3 String s1 = "Monday";
  4. 4 String s2 = "Monday";
  5. 5 if (s1 == s2)
  6. 6 {
  7. 7 System.out.println("s1 == s2");}
  8. 8 else{
  9. 9 System.out.println("s1 != s2");}
  10. 10 }
  11. 11 }

編譯並運行程序,輸出:s1 == s2說明:s1 與 s2 引用同一個 String 對象 -- "Monday"!
2.再稍微改動一下程序,會有更奇怪的發現:

[plain] view plain copy

  1. public class TestString {
  2. public static void main(String[] args) {
  3. String s1 = "Monday";
  4. String s2 = new String("Monday");
  5. if (s1 == s2)
  6. {System.out.println("s1 == s2");}
  7. else
  8. {System.out.println("s1 != s2");}
  9. if (s1.equals(s2)) {System.out.println("s1 equals s2");}
  10. else{
  11. System.out.println("s1 not equals s2");}
  12. }
  13. }

我們將s2用new操作符創建
程序輸出:
s1 != s2
s1 equals s2
說明:s1 s2分別引用了兩個"Monday"String對象


3. 字符串緩沖池
原來,程序在運行的時候會創建一個字符串緩沖池當使用 s2 = "Monday" 這樣的表達是創建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創建的時候,程序找到了具有相同值的 s1
將s2引用s1所引用的對象"Monday"
第二段程序中,使用了 new 操作符,他明白的告訴程序:"我要一個新的!不要舊的!"於是一個新的"Monday"Sting對象被創建在內存中。他們的值相同,但是位置不同,一個在池中遊泳一個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什麽呢?

4.再次更改程序:

[plain] view plain copy

  1. public class TestString {
  2. public static void main(String[] args) {
  3. String s1 = "Monday";
  4. String s2 = new String("Monday");
  5. s2 = s2.intern();
  6. if (s1 == s2)
  7. {System.out.println("s1 == s2");}
  8. else
  9. {System.out.println("s1 != s2");}
  10. if (s1.equals(s2)) {System.out.println("s1 equals s2");}
  11. else{
  12. System.out.println("s1 not equals s2");}
  13. }
  14. }

這次加入:s2 = s2.intern();
程序輸出:
s1 == s2
s1 equals s2

原 來,(Java.lang.String的intern()方法"abc".intern()方法的返回值還是字符串"abc",表面上看起來好像這個方 法沒什麽用處。但實際上,它做了個小動作:檢查字符串池裏是否存在"abc"這麽一個字符串,如果存在,就返回池裏的字符串;如果不存在,該方法會 把"abc"添加到字符串池中,然後再返回它的引用。

null和“”的區別

String str1 = null; str引用為空
String str2 = ""; str引用一個空串


也就是null沒有分配空間,""分配了空間,因此str1還不是一個實例化的對象,而str2已經實例化。
註意因為null不是對象,""是對象。所以比較的時候必須是 if(str1==null){...}和if(str2.equals("")){...}。
對象用equals比較,null用等號比較。因此,如果str1=null;下面的寫法錯誤:
if(str1.equals("")||str1==null){//如果str1沒有值,則....
//。。。。
}
正確的寫法是 if(str1==null||str1.equals("")){ //先判斷是不是對象,如果是,再判斷是不是空字符串
//...
}
打個比方:一個空玻璃杯,你不能說它裏面什麽都沒有,因為裏面有空氣,當然也可以把它弄成真空,null與" "的區別就象真空與空氣一樣。

下面關於一篇比較好的見解:地址http://www.hui52.com/archives/165.html

equals()和“==”操作用於對象的比較,檢查倆對象的相等性,但是他們倆的主要區別在於前者是方法後者是操作符。由於java不支持操作符重載(overloading),“==”的行為對於每個對象來說與equals()是完全相同的,但是equals()可以基於業務規則的不同而重寫(overridden )。另一個需要註意的不同點是“==”習慣用於原生(primitive)類型之間的比較,而equals()僅用於對象之間的比較。同時初學者奮力地想找到什麽時候使用等號操作“==”,什麽時候使用equals方法。這篇教程中你將將看到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()返回不同的結果。

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

[plain] view plain copy

  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
  4. boolean result = personalLoan == homeLoan;
  5. System.out.println("Comparing two strings with == operator: " + result);
  6. //since strings contains same content , equals() should return true
  7. result = personalLoan.equals(homeLoan);
  8. System.out.println("Comparing two Strings with same content using equals method: " + result);
  9. homeLoan = personalLoan;
  10. //since both homeLoan and personalLoand reference variable are pointing to same object
  11. //"==" should return true
  12. result = (personalLoan == homeLoan);
  13. System.out.println("Comparing two reference pointing to same String with == operator: " + result);

Output:

[plain] view plain copy

  1. Comparing two strings with == operator: false
  2. Comparing two Strings with same content using equals method: true
  3. Comparing two reference pointing to same String with == operator: true


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

[plain] view plain copy

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

Output:

[plain] view plain copy

  1. Comparing two different Objects with == operator: false
  2. Comparing two different Objects with equals() method: false
  3. Comparing two reference pointing to same Object with == operator: true

總結:
使用==比較原生類型如:boolean、int、char等等,使用equals()比較對象。
==返回true如果兩個引用指向相同的對象,equals()的返回結果依賴於具體業務實現
字符串的對比使用equals()代替==操作符
以上就是關於equals方法和==操作符的區別,其主要的不同是一個是操作符一個是方法,==用於對比原生類型而equals()方法比較對象的相等性

==和equals區別