Java equals 和 == 比較

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

      Object中的equals方法代碼:
              public boolean equals(Object obj) {
                    return (this == obj);// 比較的是基於複合型數據類型的內存地址
              } this

      String中的equals方法代碼:
              public boolean equals(Object anObject) {
                       if (this == anObject) {
                              return true;
                        }
                       if (anObject instanceof String) {
                              String anotherString = (String) anObject;
                              int n = value.length;
                              if (n == anotherString.value.length) {
                                    char v1[] = value;
                                    char v2[] = anotherString.value;
                                     int i = 0;
                                     while (n-- != 0) {
                                          if (v1[i] != v2[i])
                                               return false;
                                          i++;
                                       }
                                       return true;
                                }
                         }
                  return false;
                }
      因此對於複合型數據類型之間的equals比較,在沒有覆寫該方法以前,他們之間的比較仍是基於內存地址的比較。 spa

      下面舉個String類型的例子:
       1.
         public class TestString {
   public static void main(String[] args) {
   String s1 = "Monday";
   String s2 = "Monday";
   if (s1 == s2)
   {
   System.out.println("s1 == s2");}
   else{
   System.out.println("s1 != s2");}
  }
   }
 編譯並運行程序,輸出:s1 == s2說明:s1 與 s2 引用同一個 String 對象 -- "Monday"!
 2.
   public class TestString {
  public static void main(String[] args) {
   String s1 = "Monday";
   String s2 = new String("Monday");
   if (s1 == s2)
   {System.out.println("s1 == s2");}
   else
   {System.out.println("s1 != s2");}
   if (s1.equals(s2)) {System.out.println("s1 equals s2");}
   else{
   System.out.println("s1 not equals s2");}
  }
  }
  咱們將s2用new操做符建立
 程序輸出:
 s1 != s2
 s1 equals s2
 說明:s1 s2分別引用了兩個"Monday"String對象 對象

 緣由解釋:
     字符串緩衝池:程序在運行的時候會建立一個字符串緩衝池。
     當使用s2 = "Monday"這樣的表達式建立字符串的時候,程序首先會在這個String緩衝池中尋找相同值的對象,
     在第一個程序中,s1先被放到池中,因此在s2被建立的時候,程序找到相同值的s1,s2引用s2所引用的對象。
     第二段程序中,使用了 new 操做符,他明白的告訴程序:"我要一個新的!不要舊的!"因而一個新的"Monday"Sting對象被建立在內存中。他們的值相同,可是位置不一樣。
 3.
   public class TestString {
  public static void main(String[] args) {
   String s1 = "Monday";
   String s2 = new String("Monday");
   s2 = s2.intern();
   if (s1 == s2)
   {System.out.println("s1 == s2");}
   else
   {System.out.println("s1 != s2");}
   if (s1.equals(s2)) {System.out.println("s1 equals s2");}
   else{
   System.out.println("s1 not equals s2");}
  }
  } 繼承

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

 緣由解釋:java.lang.String的intern方法的返回值是字符串,可是它其實是先檢查該字符串是否在字符串緩衝池中存在,存在就返回該引用,不存在就會把該字符串加到字符串緩衝池中再返回該引用。 字符串

相關文章
相關標籤/搜索