Java中==與equals()的用法及區(qū)別總結
1. 一句話總結
==:基本類型比值;引用類型比地址(判斷是否指向堆中同一個對象)。equals():是一個方法。默認實現(Object類)也是比地址;但String、包裝類等通過重寫實現了內容/邏輯相等的比較。
核心金句:
==判斷“是不是同一個”;equals()判斷“長得像不像”(取決于是否重寫)。
2. 核心區(qū)別對比表
| 特性 | == | equals() |
|---|---|---|
| 本質 | Java 運算符 | Object 類的方法 |
| 比較內容 | 基本類型比數值,引用類型比內存地址 | 默認比地址,重寫后比對象內容 |
| 可定制性 | 不可重寫,行為固定 | 可以重寫,自定義邏輯相等規(guī)則 |
| 適用范圍 | 任何基本類型或對象引用 | 僅限對象(不能用于基本類型) |
| null 處理 | null == null 為 true | null.equals(...) 會拋 NPE |
3.==的用法
3.1 基本類型比較(比較值)
int a = 10; int b = 10; System.out.println(a == b); // true char c1 = 'A'; char c2 = 'B'; System.out.println(c1 == c2); // false
3.2 引用類型比較(比較地址)
String s1 = new String("Java");
String s2 = new String("Java");
String s3 = s1;
System.out.println(s1 == s2); // false(不同對象)
System.out.println(s1 == s3); // true(同一引用)
4.equals()的用法
4.1 默認行為:Object.equals()等同于==
public boolean equals(Object obj) {
return (this == obj);
}
4.2 重寫后的行為:比較內容/邏輯相等
String 重寫了 equals(),比較字符串內容:
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1.equals(s2)); // true
5. 進階高頻考點(建議必背)
5.1 字符串常量池(String Pool)
面試??迹簽槭裁?a == b 有時是 true,有時是 false?
String a = "abc";
String b = "abc";
String c = new String("abc");
System.out.println(a == b); // true(常量池同一對象)
System.out.println(a == c); // false(new 在堆上創(chuàng)建新對象)
System.out.println(a.equals(c)); // true(內容相等)
補充:
String d = c.intern(); System.out.println(a == d); // true(intern 返回常量池引用)
5.2 包裝類緩存機制(Integer Cache)
Integer、Short、Byte、Character、Long(部分范圍)存在緩存機制。
Integer x = 127; Integer y = 127; Integer m = 128; Integer n = 128; System.out.println(x == y); // true (緩存 -128~127) System.out.println(m == n); // false (超出緩存范圍) System.out.println(m.equals(n)); // true
結論:比較包裝類型的值,優(yōu)先用 equals()(或拆箱成基本類型再比 ==,注意 null 拆箱會 NPE)。
5.3equals()與hashCode()的契約(HashMap/HashSet 面試點)
- 兩個對象如果
equals()為true,那么它們的hashCode()必須相同。 HashMap/HashSet的基本流程:先hashCode()定位桶,再equals()精確比較。- 如果只重寫
equals()不重寫hashCode():可能出現“放得進去、取不出來”或“重復放入”的問題。
6.equals()正確重寫規(guī)則(契約)
- 自反性:
x.equals(x)必須為true。 - 對稱性:
x.equals(y)為true則y.equals(x)也為true。 - 傳遞性:
x.equals(y)、y.equals(z)為true則x.equals(z)必須為true。 - 一致性:對象狀態(tài)不變時,多次調用結果一致。
- 非空性:
x.equals(null)必須為false。
7.instanceof還是getClass()?(加分點)
getClass():要求必須同一具體類才相等,更嚴格,較不易破壞對稱性。instanceof:允許子類參與比較,更靈活,但繼承體系下容易破壞對稱性/傳遞性。
8.null安全:避免 NPE 的寫法(實用)
8.1 容易出錯
String s = null;
System.out.println(s.equals("a")); // NPE
8.2 推薦寫法
String s = null;
System.out.println("a".equals(s)); // false
或:
System.out.println(java.util.Objects.equals(s, "a")); // false(null-safe)
9. 一個規(guī)范的重寫示例(可背模板)
import java.util.Objects;
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
10. 什么時候用==?什么時候用equals()?(面試收尾)
- 基本類型:用
==。 - 判斷兩個引用是否指向同一對象:用
==。 - 判斷對象內容(業(yè)務邏輯相等):用
equals()(并確保類正確重寫equals/hashCode)。 - 比較
enum:推薦使用==(枚舉天然單例,且語義明確)。
11. 常見追問補充(可選)
StringBuilder/StringBuffer的equals():沒有重寫,仍是地址比較;要比內容用toString()。- 數組的
equals():數組沒有重寫equals(),比較地址;比內容用Arrays.equals()/Arrays.deepEquals()。 - 浮點數比較:
==可能因精度誤差不可靠,業(yè)務上常用誤差范圍(epsilon)比較。
總結
到此這篇關于Java中==與equals()的用法及區(qū)別總結的文章就介紹到這了,更多相關Java ==與equals()區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring boot整合mybatis+mybatis-plus的示例代碼
這篇文章主要介紹了spring boot整合mybatis+mybatis-plus的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法
這篇文章主要給大家介紹了IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法,文中通過代碼示例和圖文講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-02-02
解決springboot的JPA在Mysql8新增記錄失敗的問題
這篇文章主要介紹了解決springboot的JPA在Mysql8新增記錄失敗的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Spring?Boot項目中使用OpenAI-Java的示例詳解
Spring?Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程,這篇文章主要介紹了Spring?Boot項目中使用OpenAI-Java的示例詳解,需要的朋友可以參考下2023-04-04
Apache?SkyWalking?修復TTL?timer?失效bug詳解
這篇文章主要為大家介紹了Apache?SkyWalking?修復TTL?timer?失效bug詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
解決mapper自動裝配識別不了,Could not autowire.No beans&
文章介紹了在使用MyBatisX插件和MybatisPlus自動生成代碼后,如何解決Spring Boot項目中自動注入`UserMapper`時報錯的問題,主要方法包括在主配置類或啟動類上添加`@MapperScan`注解,指定Mapper文件夾所在的包路徑,以及在Mapper類上添加`@Repository`注解2024-11-11

