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

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

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

1. 一句話總結(jié)

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

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

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

特性==equals()
本質(zhì)Java 運算符Object 類的方法
比較內(nèi)容基本類型比數(shù)值,引用類型比內(nèi)存地址默認比地址,重寫后比對象內(nèi)容
可定制性不可重寫,行為固定可以重寫,自定義邏輯相等規(guī)則
適用范圍任何基本類型或?qū)ο笠?/td>僅限對象(不能用于基本類型)
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 重寫后的行為:比較內(nèi)容/邏輯相等

String 重寫了 equals(),比較字符串內(nèi)容:

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(內(nèi)容相等)

補充:

String d = c.intern();
System.out.println(a == d); // true(intern 返回常量池引用)

5.2 包裝類緩存機制(Integer Cache)

Integer、ShortByte、CharacterLong(部分范圍)存在緩存機制。

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

結(jié)論:比較包裝類型的值,優(yōu)先用 equals()(或拆箱成基本類型再比 ==,注意 null 拆箱會 NPE)。

5.3equals()與hashCode()的契約(HashMap/HashSet 面試點)

  • 兩個對象如果 equals()true,那么它們的 hashCode() 必須相同。
  • HashMap/HashSet 的基本流程:先 hashCode() 定位桶,再 equals() 精確比較。
  • 如果只重寫 equals() 不重寫 hashCode():可能出現(xiàn)“放得進去、取不出來”或“重復(fù)放入”的問題。

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)不變時,多次調(diào)用結(jié)果一致。
  5. 非空性x.equals(null) 必須為 false。

7.instanceof還是getClass()?(加分點)

  • getClass():要求必須同一具體類才相等,更嚴(yán)格,較不易破壞對稱性。
  • 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()?(面試收尾)

  • 基本類型:用 ==。
  • 判斷兩個引用是否指向同一對象:用 ==。
  • 判斷對象內(nèi)容(業(yè)務(wù)邏輯相等):用 equals()(并確保類正確重寫 equals/hashCode)。
  • 比較 enum:推薦使用 ==(枚舉天然單例,且語義明確)。

11. 常見追問補充(可選)

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

總結(jié) 

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

相關(guān)文章

  • Java讀取數(shù)據(jù)庫表的示例代碼

    Java讀取數(shù)據(jù)庫表的示例代碼

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

    JAVA實現(xiàn)雙向鏈表的增刪功能的方法

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

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

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

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

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

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

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

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

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

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

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

    Spring?Boot項目中使用OpenAI-Java的示例詳解

    Spring?Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,這篇文章主要介紹了Spring?Boot項目中使用OpenAI-Java的示例詳解,需要的朋友可以參考下
    2023-04-04
  • Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解

    Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解

    這篇文章主要為大家介紹了Apache?SkyWalking?修復(fù)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

最新評論

隆安县| 资中县| 多伦县| 舞钢市| 区。| 邵阳市| 阿鲁科尔沁旗| 任丘市| 霞浦县| 蛟河市| 泰州市| 石城县| 铜鼓县| 华亭县| 广灵县| 宝应县| 抚顺市| 韩城市| 澄迈县| 长沙市| 米易县| 永修县| 囊谦县| 菏泽市| 灵宝市| 辽阳县| 永善县| 崇信县| 白城市| 南木林县| 阳信县| 昆明市| 通榆县| 民勤县| 吉安县| 哈巴河县| 资源县| 通榆县| 永修县| 湘阴县| 丰都县|