1. 程式人生 > 實用技巧 >== 和 equals 的區別是什麼?

== 和 equals 的區別是什麼?

Java基礎

== 和 equals 的區別是什麼?

==的含義:

  • 基本資料型別(也稱原始資料型別) :byte,short,char,int,long,float,double,boolean。他們之間的比較,應用雙等號(==),比較的是他們的值。
  • 引用資料型別:當他們用(==)進行比較的時候,比較的是他們在記憶體中的存放地址(確切的說,是堆記憶體地址)。
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

解讀:因為 x 和 y 指向的是同一個引用,所以 == 也是 true,而 new String()方法則重寫開闢了記憶體空間,所以 == 結果為 false,而 equals 比較的一直是值,所以結果都為 true。

equals的含義:

JAVA當中所有的類都是繼承於Object這個超類的,在Object類中定義了一個equals的方法,equals的原始碼是這樣寫的:

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

可以看到,這個方法的初始預設行為是比較物件的記憶體地址值,一般來說,意義不大。所以,在一些類庫當中這個方法被重寫了,如String、Integer、Date。在這些類當中equals有其自身的實現(一般都是用來比較物件的成員變數值是否相同),而不再是比較類在堆記憶體中的存放地址了。

所以說,對於複合資料型別之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是記憶體中的存放位置的地址值,跟雙等號(==)的結果相同;如果被複寫,按照複寫的要求來。

總結:

== 對於基本型別來說是值比較,對於引用型別來說是比較的是引用;而 equals 預設情況下是引用比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

String類的equals方法:

  public class StringDemo {
      public static void main(String args[]) {
          String str1 = "Hello";
          String str2 = new String("Hello");
          String str3 = str2; // 引用傳遞
          System.out.println(str1 == str2); // false
          System.out.println(str1 == str3); // false
          System.out.println(str2 == str3); // true
          System.out.println(str1.equals(str2)); // true
          System.out.println(str1.equals(str3)); // true
          System.out.println(str2.equals(str3)); // true
     }
 }

可以看到我們new了一個物件,用“==”比較s1和s2,返回的結果卻是false;而用用“equals”比較s1和s2,返回的結果是true。

  • ==:比較的是兩個字串記憶體地址(堆記憶體)的數值是否相等,屬於數值比較;
  • equals():比較的是兩個字串的內容,屬於內容比較。