亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

== 操作符

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

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

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

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

String 類(lèi)的源碼:

    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 類(lèi)源碼:

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

AbstractMap 類(lèi)源碼:

? ? 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 類(lèi)

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)情況下與 == 的行為相同(比較引用)。
  • 一些類(lèi)會(huì)覆蓋 equals() 方法以便在內(nèi)容上進(jìn)行比較,例如 String、Integer、Double 等。

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

總結(jié)

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

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

相關(guān)文章

  • 一文了解SpringBoot是如何連接數(shù)據(jù)庫(kù)的

    一文了解SpringBoot是如何連接數(shù)據(jù)庫(kù)的

    Spring Boot提供了一系列的開(kāi)箱即用的功能和特性,使得開(kāi)發(fā)人員可以快速構(gòu)建和部署應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于SpringBoot是如何連接數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Javassist之一秒理解java動(dòng)態(tài)編程

    Javassist之一秒理解java動(dòng)態(tài)編程

    概述Javassist是一款字節(jié)碼編輯工具,可以直接編輯和生成Java生成的字節(jié)碼,以達(dá)到對(duì).class文件進(jìn)行動(dòng)態(tài)修改的效果。
    2019-06-06
  • IDEA自動(dòng)生成TestNG的testng.xml的插件方法

    IDEA自動(dòng)生成TestNG的testng.xml的插件方法

    這篇文章主要介紹了IDEA自動(dòng)生成TestNG的testng.xml的插件方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例

    為了防止數(shù)據(jù)庫(kù)被清庫(kù)或者誤刪數(shù)據(jù)庫(kù)的情況,所以需要定時(shí)將mysql數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行備份,本文主要介紹了springboot定時(shí)任務(wù)備份mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Springboot整合freemarker 404問(wèn)題解決方案

    Springboot整合freemarker 404問(wèn)題解決方案

    這篇文章主要介紹了Springboot整合freemarker 404問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Eclipse創(chuàng)建java程序可執(zhí)行jar包教程

    Eclipse創(chuàng)建java程序可執(zhí)行jar包教程

    這篇文章主要為大家分享了Eclipse創(chuàng)建java程序可執(zhí)行jar包教程,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • spring-data-jpa中findOne與getOne的區(qū)別說(shuō)明

    spring-data-jpa中findOne與getOne的區(qū)別說(shuō)明

    這篇文章主要介紹了spring-data-jpa中findOne與getOne的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 深入理解SpringBoot中關(guān)于Mybatis使用方法

    深入理解SpringBoot中關(guān)于Mybatis使用方法

    這篇文章主要介紹了SpringBoot中關(guān)于Mybatis使用方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • Java中使用正則表達(dá)式獲取網(wǎng)頁(yè)中所有圖片的路徑

    Java中使用正則表達(dá)式獲取網(wǎng)頁(yè)中所有圖片的路徑

    這篇文章主要介紹了Java中使用正則表達(dá)式獲取網(wǎng)頁(yè)中所有圖片的路徑,本文直接給出實(shí)例代碼,需要的朋友可以參考下
    2015-06-06
  • 使用java代碼獲取新浪微博應(yīng)用的access token代碼實(shí)例

    使用java代碼獲取新浪微博應(yīng)用的access token代碼實(shí)例

    這篇文章主要介紹了使用java代碼獲取新浪微博應(yīng)用的access token實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論