最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中==與equals()的用法及區(qū)別總結

 更新時間:2026年05月18日 11:32:01   作者:莫寒清  
在Java編程中==運算符和equals方法是常用來比較對象或基本數據類型的重要工具,這篇文章主要介紹了Java中==與equals()的用法及區(qū)別總結的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1. 一句話總結

  • ==基本類型比值引用類型比地址(判斷是否指向堆中同一個對象)。
  • equals():是一個方法。默認實現(Object 類)也是比地址;但 String、包裝類等通過重寫實現了內容/邏輯相等的比較。

核心金句== 判斷“是不是同一個”;equals() 判斷“長得像不像”(取決于是否重寫)。

2. 核心區(qū)別對比表

特性==equals()
本質Java 運算符Object 類的方法
比較內容基本類型比數值,引用類型比內存地址默認比地址,重寫后比對象內容
可定制性不可重寫,行為固定可以重寫,自定義邏輯相等規(guī)則
適用范圍任何基本類型或對象引用僅限對象(不能用于基本類型)
null 處理null == null 為 truenull.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ī)則(契約)

  1. 自反性x.equals(x) 必須為 true
  2. 對稱性x.equals(y)truey.equals(x) 也為 true。
  3. 傳遞性x.equals(y)y.equals(z)truex.equals(z) 必須為 true。
  4. 一致性:對象狀態(tài)不變時,多次調用結果一致。
  5. 非空性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. 常見追問補充(可選)

  1. StringBuilder / StringBufferequals():沒有重寫,仍是地址比較;要比內容用 toString()
  2. 數組的 equals():數組沒有重寫 equals(),比較地址;比內容用 Arrays.equals() / Arrays.deepEquals()。
  3. 浮點數比較== 可能因精度誤差不可靠,業(yè)務上常用誤差范圍(epsilon)比較。

總結 

到此這篇關于Java中==與equals()的用法及區(qū)別總結的文章就介紹到這了,更多相關Java ==與equals()區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java讀取數據庫表的示例代碼

    Java讀取數據庫表的示例代碼

    這篇文章主要介紹了Java讀取數據庫表,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • JAVA實現雙向鏈表的增刪功能的方法

    JAVA實現雙向鏈表的增刪功能的方法

    本篇文章主要介紹了JAVA實現雙向鏈表的增刪功能的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • spring boot整合mybatis+mybatis-plus的示例代碼

    spring boot整合mybatis+mybatis-plus的示例代碼

    這篇文章主要介紹了spring boot整合mybatis+mybatis-plus的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法

    IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法

    這篇文章主要給大家介紹了IDEA啟動Springboot報錯:無效的目標發(fā)行版:17 的解決辦法,文中通過代碼示例和圖文講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 解決springboot的JPA在Mysql8新增記錄失敗的問題

    解決springboot的JPA在Mysql8新增記錄失敗的問題

    這篇文章主要介紹了解決springboot的JPA在Mysql8新增記錄失敗的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 如何利用Java實現MySQL的數據變化監(jiān)聽

    如何利用Java實現MySQL的數據變化監(jiān)聽

    在高并發(fā)和大數據環(huán)境下,實時獲取?MySQL?數據庫的增量變化對數據同步、數據分析、緩存更新等場景至關重要,下面我們就來看看如何通過Java實現MySQL的數據變化監(jiān)聽吧
    2025-02-02
  • java 中鏈表的定義與使用方法

    java 中鏈表的定義與使用方法

    這篇文章主要介紹了java 中鏈表的定義與使用方法的相關資料,需要的朋友可以參考下
    2017-03-03
  • Spring?Boot項目中使用OpenAI-Java的示例詳解

    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詳解

    這篇文章主要為大家介紹了Apache?SkyWalking?修復TTL?timer?失效bug詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 解決mapper自動裝配識別不了,Could not autowire.No beans of‘UserMapper‘type found

    解決mapper自動裝配識別不了,Could not autowire.No beans&

    文章介紹了在使用MyBatisX插件和MybatisPlus自動生成代碼后,如何解決Spring Boot項目中自動注入`UserMapper`時報錯的問題,主要方法包括在主配置類或啟動類上添加`@MapperScan`注解,指定Mapper文件夾所在的包路徑,以及在Mapper類上添加`@Repository`注解
    2024-11-11

最新評論

搜索| 农安县| 沁源县| 金乡县| 井陉县| 康乐县| 新乐市| 伊宁县| 克拉玛依市| 台北市| 越西县| 阳东县| 五大连池市| 临沂市| 深泽县| 临湘市| 怀宁县| 子长县| 易门县| 潮安县| 西青区| 广南县| 高安市| 伊金霍洛旗| 江川县| 吉林省| 丘北县| 房山区| 济阳县| 崇礼县| 定远县| 梓潼县| 柯坪县| 塔河县| 炉霍县| 英吉沙县| 西乡县| 孟津县| 南涧| 玉环县| 苍山县|