1. 程式人生 > >[轉] equals和==的區別小結

[轉] equals和==的區別小結

strong www. archive object 復制 什麽 borde off add

==:

== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。

1、比較的是操作符兩端的操作數是否是同一個對象。
2、兩邊的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。
3、比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為true,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。

equals:

  equals用來比較的是兩個對象的內容是否相等,由於所有的類都是繼承自java.lang.Object類的,所以適用於所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。

  String s="abce"是一種非常特殊的形式,和new 有本質的區別。它是java中唯一不需要new 就可以產生對象的途徑。以String s="abce";形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字符串,在JVM內部發生字符串拘留,即當聲明這樣的一個字符串後,JVM會在常量池中先查找有有沒有一個值為"abcd"的對象,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指點向了同一對象,如果沒有,則在常量池中新創建一個"abcd",下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個對象,即以這形式聲明的字符串,只要值相等,任何多個引用都指向同一對象.

  而String s = new String("abcd");和其它任何對象一樣.每調用一次就產生一個對象,只要它們調用。

  也可以這麽理解: String str = "hello"; 先在內存中找是不是有"hello"這個對象,如果有,就讓str指向那個"hello".如果內存裏沒有"hello",就創建一個新的對象保存"hello". String str=new String ("hello") 就是不管內存裏是不是已經有"hello"這個對象,都新建一個對象保存"hello"。

具體可以看下面的代碼:

技術分享
 1 public class test1 {
 2     public static void main(String[] args) {
 3         String a = new String("ab"); // a 為一個引用
 4         String b = new String("ab"); // b為另一個引用,對象的內容一樣
 5         String aa = "ab"; // 放在常量池中
 6         String bb = "ab"; // 從常量池中查找
 7         if (aa == bb) // true
 8             System.out.println("aa==bb");
 9         if (a == b) // false,非同一對象
10             System.out.println("a==b");
11         if (a.equals(b)) // true
12             System.out.println("aEQb");
13         if (42 == 42.0) { // true
14             System.out.println("true");
15         }
16     }
17 }
技術分享

equals和==的區別

equals方法最初是在所有類的基類Object中進行定義的,源碼是

1 2 3 public boolean equals(Object obj) { return (this == obj); }

  由equals的源碼可以看出這裏定義的equals與==是等效的(Object類中的equals沒什麽區別),不同的原因就在於有些類(像String、Integer等類)對equals進行了重寫,但是沒有對equals進行重寫的類(比如我們自己寫的類)就只能從Object類中繼承equals方法,其equals方法與==就也是等效的,除非我們在此類中重寫equals。

  對equals重新需要註意五點:

  1 自反性:對任意引用值X,x.equals(x)的返回值一定為true;
  2 對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true;
  3 傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true ;
  4 一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變;
  5 非空性:任何非空的引用值X,x.equals(null)的返回值一定為false 。

String類對equals的重寫如下:

技術分享
 1 public boolean equals(Object anObject) {
 2     if (this == anObject) {
 3         return true;
 4     }
 5     if (anObject instanceof String) {
 6         String anotherString = (String)anObject;
 7         int n = count;
 8         if (n == anotherString.count) {
 9         char v1[] = value;
10         char v2[] = anotherString.value;
11         int i = offset;
12         int j = anotherString.offset;
13         while (n-- != 0) {
14             if (v1[i++] != v2[j++])
15             return false;
16         }
17         return true;
18         }
19     }
20     return false;
21     }
技術分享

  

  另外,"=="比"equals"運行速度快,因為"=="只是比較引用。

文章參考自:http://www.cnblogs.com/ok-lanyan/archive/2012/11/22/2782337.html

      http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html

[轉] equals和==的區別小結