equals與==的區別

==:

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

一、比較的是操做符兩端的操做數是不是同一個對象。
二、兩邊的操做數必須是同一類型的(能夠是父子類之間)才能編譯經過。
三、比較的是地址,若是是具體的阿拉伯數字的比較,值相等則爲true,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(爲true),由於他們都指向地址爲10的堆java

equals:

  equals用來比較的是兩個對象的內容是否相等,因爲全部的類都是繼承自java.lang.Object類的,因此適用於全部對象,若是沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的倒是==的判斷。this

  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");和其它任何對象同樣.每調用一次就產生一個對象,只要它們調用。spa

  也能夠這麼理解: String str = "hello"; 先在內存中找是否是有"hello"這個對象,若是有,就讓str指向那個"hello".若是內存裏沒有"hello",就建立一個新的對象保存"hello". String str=new String ("hello") 就是無論內存裏是否是已經有"hello"這個對象,都新建一個對象保存"hello"。指針

具體能夠看下面的代碼:code

 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方法最初是在全部類的基類Object中進行定義的,源碼是htm

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

 

由equals的源碼能夠看出這裏定義的equals與==是等效的(Object類中的equals沒什麼區別),不一樣的緣由就在於有些類(像String、Integer等類)對equals進行了重寫,可是沒有對equals進行重寫的類(好比咱們本身寫的類)就只能從Object類中繼承equals方法,其equals方法與==就也是等效的,除非咱們在此類中重寫equals。對象

  對equals從新須要注意五點:blog

  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

相關文章
相關標籤/搜索