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

Java中的==和equals()區(qū)別小結(jié)

 更新時(shí)間:2023年08月14日 08:18:09   作者:修己xj  
在Java編程中,理解==操作符和equals()方法的區(qū)別是至關(guān)重要的,本文主要介紹了Java中的==和equals()區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下

在 Java 編程中,比較對(duì)象的相等性是一個(gè)常見的任務(wù)。然而,你是否知道在 Java 中有兩種不同的方法來比較對(duì)象的相等性:== 操作符和 equals() 方法?本文將深入探討這兩種方法之間的區(qū)別以及何時(shí)使用它們。

== 操作符

首先,讓我們來看看 == 操作符。在 Java 中,== 操作符用于比較兩個(gè)對(duì)象的引用是否相等,也就是判斷它們是否指向內(nèi)存中的同一個(gè)對(duì)象。如果兩個(gè)對(duì)象的引用指向同一個(gè)內(nèi)存地址,== 操作符返回 true,否則返回 false。

例如如下代碼:

        String str1 = new String("xj");
        String str2 = new String("xj");
        String str3 = str1;
        System.out.println(str1 == str2); // 輸出 false,因?yàn)閮蓚€(gè)不同的對(duì)象
        System.out.println(str1 == str3); // 輸出 true,引用指向同一個(gè)對(duì)象

equals() 方法

equals() 方法是 Object 類中定義的方法,用于比較兩個(gè)對(duì)象的內(nèi)容是否相等。默認(rèn)情況下,equals() 方法在 Object 類中的實(shí)現(xiàn)與 == 操作符的行為相同,即只比較對(duì)象的引用。然而,許多類會(huì)覆蓋 equals() 方法,以便在內(nèi)容上比較對(duì)象。

我們先來看下Object equals()方法的源碼:

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

可以看到,它使用的也是 == 操作符去判斷的,所以我們?nèi)绻褂胑quals()判斷我們自定義的對(duì)象的值是否相等時(shí)需要重寫 equals() 方法,java 中其它的一些類基本都會(huì)重寫equals()方法;

String 類的源碼:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof 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;
    }

可以看到它是先比較兩個(gè)對(duì)象是否為同一對(duì)象,是的話直接返回true,然后在判斷傳入的參數(shù)是否為String,不是的話返回false,是的話在比較兩個(gè)String 的值是否相同;

Integer 類源碼:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

AbstractMap 類源碼:

? ? public boolean equals(Object o) {
? ? ? ? if (o == this)
? ? ? ? ? ? return true;
? ? ? ? if (!(o instanceof Map))
? ? ? ? ? ? return false;
? ? ? ? Map<?,?> m = (Map<?,?>) o;
? ? ? ? if (m.size() != size())
? ? ? ? ? ? return false;
? ? ? ? try {
? ? ? ? ? ? Iterator<Entry<K,V>> i = entrySet().iterator();
? ? ? ? ? ? while (i.hasNext()) {
? ? ? ? ? ? ? ? Entry<K,V> e = i.next();
? ? ? ? ? ? ? ? K key = e.getKey();
? ? ? ? ? ? ? ? V value = e.getValue();
? ? ? ? ? ? ? ? if (value == null) {
? ? ? ? ? ? ? ? ? ? if (!(m.get(key)==null && m.containsKey(key)))
? ? ? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? if (!value.equals(m.get(key)))
? ? ? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? } catch (ClassCastException unused) {
? ? ? ? ? ? return false;
? ? ? ? } catch (NullPointerException unused) {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? return true;
? ? }

我們自定義的User 類

import java.util.Objects;
public class User {
? ? private String name;
? ? private String address;
? ? private String userId;
? ? @Override
? ? public boolean equals(Object o) {
? ? ? ? if (this == o) return true;
? ? ? ? if (o == null || getClass() != o.getClass()) return false;
? ? ? ? User user = (User) o;
? ? ? ? return Objects.equals(userId, user.userId);
? ? }
? ? @Override
? ? public int hashCode() {
? ? ? ? return Objects.hash(userId);
? ? }
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public String getAddress() {
? ? ? ? return address;
? ? }
? ? public void setAddress(String address) {
? ? ? ? this.address = address;
? ? }
? ? public String getUserId() {
? ? ? ? return userId;
? ? }
? ? public void setUserId(String userId) {
? ? ? ? this.userId = userId;
? ? }
}

可以看到如果User對(duì)象不為null的話我們equals() 方法只需比較兩個(gè)User對(duì)象的userId的值是否相同,相同的話即為同一對(duì)象,不需要比較其他屬性。

區(qū)別詳解

現(xiàn)在,讓我們總結(jié)一下 == 操作符和 equals() 方法的區(qū)別:

  • == 操作符比較對(duì)象的引用,判斷是否為同一對(duì)象。
  • equals() 方法比較對(duì)象的內(nèi)容,但默認(rèn)情況下與 == 的行為相同(比較引用)。
  • 一些類會(huì)覆蓋 equals() 方法以便在內(nèi)容上進(jìn)行比較,例如 String、Integer、Double 等。

當(dāng)你需要比較對(duì)象的內(nèi)容時(shí),務(wù)必使用適當(dāng)?shù)姆椒?。同時(shí)要注意處理參數(shù)為 null 的情況,以及在自定義類中正確地覆蓋 equals() 方法,以便在語義上正確地比較對(duì)象內(nèi)容。

總結(jié)

在 Java 編程中,理解 == 操作符和 equals() 方法的區(qū)別是至關(guān)重要的。通過本文的解釋,相信你已經(jīng)對(duì)這兩種方法有了更清晰的認(rèn)識(shí)。根據(jù)具體情況,選擇正確的比較方式將有助于你編寫更健壯和可靠的代碼。

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

相關(guān)文章

  • springboot根據(jù)實(shí)體類生成表的實(shí)現(xiàn)方法

    springboot根據(jù)實(shí)體類生成表的實(shí)現(xiàn)方法

    本文介紹了如何通過SpringBoot工程引入SpringDataJPA,并通過實(shí)體類自動(dòng)生成數(shù)據(jù)庫表的過程,包括常見問題解決方法,感興趣的可以了解一下
    2024-09-09
  • Spring Mybatis 基本使用過程(推薦)

    Spring Mybatis 基本使用過程(推薦)

    Mybatis是一個(gè)半自動(dòng)ORM(Object Relational Mapping)框架,它可以簡(jiǎn)化數(shù)據(jù)庫編程,讓開發(fā)者更專注于SQL本身,本文給大家介紹Spring Mybatis 基本使用過程,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 關(guān)于SpringBoot靜態(tài)資源路徑管理問題

    關(guān)于SpringBoot靜態(tài)資源路徑管理問題

    這篇文章主要介紹了SpringBoot靜態(tài)資源路徑管理,主要包括默認(rèn)靜態(tài)資源路徑,增加靜態(tài)資源路徑前綴的相關(guān)操作,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Linux中使用shell腳本管理Java應(yīng)用程序

    Linux中使用shell腳本管理Java應(yīng)用程序

    在日常開發(fā)和運(yùn)維工作中,管理基于Java的應(yīng)用程序是一項(xiàng)基礎(chǔ)且頻繁的任務(wù),本文將通過一個(gè)示例腳本,展示如何利用Shell腳本簡(jiǎn)化這一流程,實(shí)現(xiàn)Java應(yīng)用的一鍵式啟動(dòng)、停止與重啟操作,本腳本不僅提升了工作效率,還確保了操作的標(biāo)準(zhǔn)化與可靠性
    2024-06-06
  • BeanUtils.copyProperties()屬性名相同但是類型不同問題

    BeanUtils.copyProperties()屬性名相同但是類型不同問題

    這篇文章主要介紹了BeanUtils.copyProperties()屬性名相同但是類型不同問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • SpringBoot中Redis自動(dòng)配置的介紹、原理和使用詳解

    SpringBoot中Redis自動(dòng)配置的介紹、原理和使用詳解

    這篇文章主要介紹了SpringBoot中Redis自動(dòng)配置的介紹、原理和使用詳解,Redis是一種高性能的鍵值對(duì)存儲(chǔ)數(shù)據(jù)庫,它支持多種數(shù)據(jù)結(jié)構(gòu)和豐富的功能,如緩存、消息隊(duì)列、計(jì)數(shù)器、分布式鎖等,需要的朋友可以參考下
    2023-08-08
  • Java的位圖和布隆過濾器深入詳細(xì)講解

    Java的位圖和布隆過濾器深入詳細(xì)講解

    這篇文章主要介紹了Java的位圖和布隆過濾器,在學(xué)習(xí)之前的數(shù)據(jù)結(jié)構(gòu)的時(shí)候,我們使用的數(shù)據(jù)量都不是很大,但是在生活中,我們常常面臨著要處理大量數(shù)據(jù)結(jié)果并得出最終結(jié)果,那么有沒有什么數(shù)據(jù)結(jié)構(gòu)可以幫助我們實(shí)現(xiàn)這樣的功能呢,想要繼續(xù)了解的朋友可以參考下
    2024-10-10
  • Java設(shè)計(jì)模式之策略模式定義與用法詳解

    Java設(shè)計(jì)模式之策略模式定義與用法詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式定義與用法,結(jié)合具體實(shí)例形式詳細(xì)分析了Java策略模式的概念、原理、定義及相關(guān)操作技巧,需要的朋友可以參考下
    2018-02-02
  • Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作示例

    Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作,結(jié)合實(shí)例形式分析了靜態(tài)工廠方法創(chuàng)建Bean的相關(guān)實(shí)現(xiàn)步驟與操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • Java利用Spire.XLS for Java在Excel中添加或刪除批注

    Java利用Spire.XLS for Java在Excel中添加或刪除批注

    在日常的數(shù)據(jù)處理工作中,我們經(jīng)常需要在 Excel 表格中添加批注來解釋數(shù)據(jù)、提供背景信息或標(biāo)記待辦事項(xiàng),本文將深入探討如何在 Java高效地實(shí)現(xiàn) Excel 批注的添加與刪除,下面小編就和大家介紹一下吧
    2025-11-11

最新評(píng)論

弥渡县| 天长市| 称多县| 保康县| 灵武市| 呼伦贝尔市| 临西县| 焉耆| 定结县| 成武县| 桃源县| 全州县| 察雅县| 博湖县| 柏乡县| 清新县| 左云县| 广南县| 怀宁县| 吐鲁番市| 娄烦县| 芷江| 微山县| 海南省| 林口县| 康定县| 宁城县| 通海县| 福建省| 泰安市| 东平县| 牡丹江市| 德化县| 鄂托克旗| 常熟市| 高尔夫| 西乌珠穆沁旗| 焉耆| 开封市| 铁岭县| 平远县|