在 Java 面試中,==
和 equals()
的區別是一個高頻考點。理解它們的底層原理和使用場景,對于掌握 Java 基礎知識至關重要。本文將從 基本概念、底層實現 和 實際應用 三個方面,深入解析 ==
和 equals()
的區別。
1. 基本概念
1.1 == 運算符
- 作用:比較兩個變量的值。
- 比較規則:
- 對于 基本數據類型(如
int
、char
等),比較的是變量的 值。 - 對于 引用數據類型(如
String
、Object
等),比較的是變量的 內存地址。
- 對于 基本數據類型(如
1.2 equals() 方法
- 作用:比較兩個對象的內容是否相等。
- 默認實現:
Object
類中的equals()
方法默認使用==
進行比較。- 大多數類(如
String
、Integer
等)會重寫equals()
方法,改為比較對象的內容。
2. 底層實現
2.1 == 的底層實現
- 基本數據類型:直接比較值。
int a = 10; int b = 10; System.out.println(a == b); // true
- 引用數據類型:比較內存地址。
String str1 = new String("Hello"); String str2 = new String("Hello"); System.out.println(str1 == str2); // false
2.2 equals() 的底層實現
- Object 類的默認實現:
public boolean equals(Object obj) {return (this == obj); }
- String 類的重寫實現:
public boolean equals(Object anObject) {if (this == anObject) { // 如果是同一個對象,直接返回 truereturn true;}if (anObject instanceof String) { // 判斷是否為 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; }
3. 實際應用
3.1 == 的使用場景
- 比較 基本數據類型 的值。
- 比較 引用數據類型 的內存地址(判斷是否為同一個對象)。
3.2 equals() 的使用場景
- 比較 引用數據類型 的內容是否相等。
- 需要重寫
equals()
方法以實現自定義比較邏輯。
3.3 示例代碼
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(內容相同)}
}
4. 常見面試問題
4.1 == 和 equals() 的區別是什么?
==
比較的是棧中的值(基本數據類型是值,引用類型是內存地址)。equals()
比較的是對象的內容(默認使用==
,但通常會被重寫)。
4.2 String 類的 equals() 方法是如何實現的?
- 先比較內存地址,如果相同則返回
true
。 - 再比較字符數組的長度和內容,如果完全相同則返回
true
,否則返回false
。
4.3 如何重寫 equals() 方法?
- 重寫
equals()
方法時,通常需要滿足以下條件:- 自反性:
x.equals(x)
必須為true
。 - 對稱性:如果
x.equals(y)
為true
,則y.equals(x)
也必須為true
。 - 傳遞性:如果
x.equals(y)
為true
,且y.equals(z)
為true
,則x.equals(z)
也必須為true
。 - 一致性:多次調用
x.equals(y)
的結果必須一致。 - 非空性:
x.equals(null)
必須為false
。
- 自反性:
5. 總結
- ==:用于比較基本數據類型的值或引用類型的內存地址。
- equals():用于比較對象的內容,通常需要重寫以實現自定義邏輯。
- String 類的 equals():比較字符串的內容,是重寫
equals()
方法的典型示例。