欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

== 操作符

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

例如如下代碼:

        String str1 = new String("xj");
        String str2 = new String("xj");
        String str3 = str1;
        System.out.println(str1 == str2); // 輸出 false,因為兩個不同的對象
        System.out.println(str1 == str3); // 輸出 true,引用指向同一個對象

equals() 方法

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

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

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

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

可以看到它是先比較兩個對象是否為同一對象,是的話直接返回true,然后在判斷傳入的參數(shù)是否為String,不是的話返回false,是的話在比較兩個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對象不為null的話我們equals() 方法只需比較兩個User對象的userId的值是否相同,相同的話即為同一對象,不需要比較其他屬性。

區(qū)別詳解

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

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

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

總結(jié)

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

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

相關(guān)文章

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

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

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

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

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

    IDEA自動生成TestNG的testng.xml的插件方法

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

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

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

    Springboot整合freemarker 404問題解決方案

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

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

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

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

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

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

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

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

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

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

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

最新評論