java的==運(yùn)算符和equals操作詳解
①chatgpt的解釋
在Java中,==和equals都是用于比較兩個(gè)對(duì)象的操作符,但它們的行為和用途有所不同。
==操作符:
對(duì)于基本數(shù)據(jù)類(lèi)型,比較的是它們的值是否相等。例如,int a = 5; int b = 5; System.out.println(a == b); // 輸出true
對(duì)于引用類(lèi)型,比較的是它們的引用是否相等,即是否指向同一個(gè)對(duì)象。例如,String str1 = "hello"; String str2 = "hello"; System.out.println(str1 == str2); // 輸出true
對(duì)于對(duì)象的比較,如果沒(méi)有重寫(xiě)equals方法,默認(rèn)使用的也是==操作符進(jìn)行比較。
equals方法:
equals方法是Object類(lèi)中定義的方法,用于比較兩個(gè)對(duì)象是否相等。默認(rèn)情況下,equals方法和==操作符的行為相同,即比較的是兩個(gè)對(duì)象的引用是否相等。
但是,equals方法可以被子類(lèi)重寫(xiě),以實(shí)現(xiàn)自定義的相等比較邏輯。通常情況下,我們需要重寫(xiě)equals方法來(lái)比較對(duì)象的內(nèi)容是否相等,而不僅僅是比較引用是否相等。
重寫(xiě)equals方法時(shí),通常還需要重寫(xiě)hashCode方法,以保證對(duì)象在放入哈希表等數(shù)據(jù)結(jié)構(gòu)時(shí)的正確性。
需要注意的是,對(duì)于基本數(shù)據(jù)類(lèi)型,使用==操作符進(jìn)行比較是安全的。但對(duì)于引用類(lèi)型,特別是自定義的類(lèi),通常需要使用equals方法來(lái)比較對(duì)象的內(nèi)容是否相等。在使用equals方法時(shí),需要注意遵循以下幾個(gè)原則:
- 自反性:x.equals(x)應(yīng)該返回true。
- 對(duì)稱(chēng)性:如果x.equals(y)返回true,那么y.equals(x)也應(yīng)該返回true。
- 傳遞性:如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應(yīng)該返回true。
- 一致性:多次調(diào)用x.equals(y)應(yīng)該返回相同的結(jié)果,前提是對(duì)象沒(méi)有被修改。
- 非空性:x.equals(null)應(yīng)該返回false。
②Object常用類(lèi)

1.equals(Object obj)方法:
用于比較兩個(gè)對(duì)象是否相等。
默認(rèn)情況下,使用的是==操作符進(jìn)行比較,即比較兩個(gè)對(duì)象的引用是否相等。
通常需要在自定義的類(lèi)中重寫(xiě)equals方法,以實(shí)現(xiàn)自定義的相等比較邏輯。
重寫(xiě)equals方法時(shí),通常還需要重寫(xiě)hashCode方法,以保證對(duì)象在放入哈希表等數(shù)據(jù)結(jié)構(gòu)時(shí)的正確性。
2.hashCode()方法:
返回對(duì)象的哈希碼值。
哈希碼值用于在哈希表等數(shù)據(jù)結(jié)構(gòu)中快速定位對(duì)象。
默認(rèn)情況下,hashCode方法返回的是對(duì)象的內(nèi)存地址的整數(shù)表示。
重寫(xiě)equals方法時(shí),通常也需要重寫(xiě)hashCode方法,以保證相等的對(duì)象具有相同的哈希碼值。
3.toString()方法:
返回對(duì)象的字符串表示。
默認(rèn)情況下,返回的是對(duì)象的類(lèi)名和哈希碼值的組合,例如"ClassName@hashCode"。
通常需要在自定義的類(lèi)中重寫(xiě)toString方法,以返回自定義的字符串表示。
4.getClass()方法:
返回對(duì)象的運(yùn)行時(shí)類(lèi)。
可以用于獲取對(duì)象所屬的類(lèi)的信息,例如類(lèi)名、包名等。
5.clone()方法:
創(chuàng)建并返回對(duì)象的一個(gè)副本。
需要注意的是,該方法是淺拷貝,即只復(fù)制對(duì)象的引用,而不復(fù)制對(duì)象的內(nèi)容。
如果需要實(shí)現(xiàn)深拷貝,需要在自定義的類(lèi)中重寫(xiě)clone方法,并在其中進(jìn)行逐個(gè)成員變量的復(fù)制。
6.finalize()方法:
在對(duì)象被垃圾回收器回收之前調(diào)用。
可以在子類(lèi)中重寫(xiě)該方法以執(zhí)行對(duì)象的清理操作,例如釋放資源等。
7.notify()和notifyAll()方法:
用于在多線程環(huán)境下進(jìn)行線程間的通信。
notify()方法喚醒在該對(duì)象上等待的一個(gè)線程,notifyAll()方法喚醒所有在該對(duì)象上等待的線程。
這些方法必須在同步代碼塊或同步方法中調(diào)用,并且只能由持有該對(duì)象的鎖的線程來(lái)調(diào)用。
8.wait()方法:
使當(dāng)前線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用該對(duì)象的notify()或notifyAll()方法喚醒它。
這個(gè)方法必須在同步代碼塊或同步方法中調(diào)用,并且只能由持有該對(duì)象的鎖的線程來(lái)調(diào)用。
需要注意的是,Object類(lèi)中的這些方法都是被protected修飾的,因此只能在子類(lèi)中訪問(wèn)和使用。在實(shí)際開(kāi)發(fā)中,我們通常會(huì)在自定義的類(lèi)中重寫(xiě)equals、hashCode和toString方法,以滿足具體的需求。
③==
==是一個(gè)比較運(yùn)算符;
(1)如果判斷基本類(lèi)型,判斷的是值是否相等;
(2)如果判斷引用類(lèi)型,判斷的是地址是否相等,即判斷是不是同一個(gè)對(duì)象;
④equals方法
(1)是一個(gè)方法,只能判斷引用類(lèi)型
(2)Object類(lèi)的equals方法默認(rèn)判斷的是地址是否相等,子類(lèi)中往往重寫(xiě)該方法,用于判斷內(nèi)容是否相等;
⑤如何查看jdk源碼:
在查看某個(gè)方法源碼時(shí),將光標(biāo)放在該方法處,輸入ctrl+b即可;或者是ctrl+左鍵 。
⑥lang包
java.lang包是Java語(yǔ)言的核心包之一,它包含了Java語(yǔ)言的基本類(lèi)和接口。這個(gè)包中的類(lèi)和接口是Java程序開(kāi)發(fā)中最常用的,因此它們不需要顯式地導(dǎo)入就可以直接使用。
以下是java.lang包中一些常用的類(lèi)和接口:
- Object類(lèi):Object類(lèi)是所有類(lèi)的根類(lèi),它定義了一些通用的方法,如equals()、hashCode()、toString()等。
- Class類(lèi):Class類(lèi)表示Java中的類(lèi)和接口,它提供了一些方法來(lái)獲取類(lèi)的信息,如getName()、getSuperclass()、getInterfaces()等。
- String類(lèi):String類(lèi)用于表示字符串,它提供了許多字符串操作的方法,如length()、charAt()、substring()等。
- StringBuilder和StringBuffer類(lèi):StringBuilder和StringBuffer類(lèi)用于可變的字符串操作,它們提供了一系列方法來(lái)修改和操作字符串。
- Math類(lèi):Math類(lèi)提供了一些數(shù)學(xué)運(yùn)算的方法,如abs()、sqrt()、sin()等。
- System類(lèi):System類(lèi)提供了與系統(tǒng)相關(guān)的一些方法,如獲取當(dāng)前時(shí)間、獲取系統(tǒng)屬性、標(biāo)準(zhǔn)輸入輸出等。
Throwable類(lèi)和Exception類(lèi):Throwable類(lèi)是所有錯(cuò)誤和異常的基類(lèi),Exception類(lèi)是所有可檢查異常的基類(lèi),它們提供了一些方法來(lái)處理錯(cuò)誤和異常。
Thread類(lèi)和Runnable接口:Thread類(lèi)和Runnable接口用于多線程編程,它們提供了創(chuàng)建和管理線程的方法。
除了上述提到的類(lèi)和接口,java.lang包還包含了一些其他的類(lèi)和接口,如ClassLoader類(lèi)、Enum類(lèi)、Iterable接口等。這些類(lèi)和接口提供了Java語(yǔ)言的基本功能和特性,是Java程序開(kāi)發(fā)中不可或缺的一部分。由于java.lang包中的類(lèi)和接口在Java程序中經(jīng)常被使用,所以它們不需要顯式地導(dǎo)入就可以直接使用。
是的,String類(lèi)是Object類(lèi)的子類(lèi)。在Java中,所有的類(lèi)都直接或間接地繼承自O(shè)bject類(lèi)。因此,String類(lèi)繼承了Object類(lèi)的所有方法,如equals()、hashCode()、toString()等。同時(shí),String類(lèi)還提供了一些自己特有的方法,用于字符串的操作和處理。由于String類(lèi)是Object類(lèi)的子類(lèi),所以可以將String對(duì)象賦值給Object類(lèi)型的變量,也可以將String對(duì)象作為參數(shù)傳遞給接受Object類(lèi)型參數(shù)的方法。但需要注意的是,雖然String類(lèi)繼承了Object類(lèi)的方法,但它對(duì)其中的一些方法進(jìn)行了重寫(xiě),以實(shí)現(xiàn)字符串的特定功能。
到此這篇關(guān)于java的==運(yùn)算符和equals詳解的文章就介紹到這了,更多相關(guān)java ==運(yùn)算符和equals內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java LinkedHashSet集合的底層原理和TreeSet集合
- Java中HashMap和HashSet的高效使用技巧分享
- Java中的Set接口實(shí)現(xiàn)類(lèi)HashSet和LinkedHashSet詳解
- Java集合ArrayList、LinkedList、HashMap、HashSet最大容量
- Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解
- Java中==和equals()的區(qū)別總結(jié)
- java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals
- 詳解Java中==和equals()的區(qū)別
- 淺談java字符串比較到底應(yīng)該用==還是equals
- java中的HashSet與 == 和 equals的區(qū)別示例解析
相關(guān)文章
springboot項(xiàng)目配置logback-spring.xml實(shí)現(xiàn)按日期歸檔日志的方法
本文主要介紹了springboot項(xiàng)目配置logback-spring.xml實(shí)現(xiàn)按日期歸檔日志的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
SpringBoot整合Elasticsearch實(shí)現(xiàn)索引和文檔的操作方法
Elasticsearch 基于 Apache Lucene 構(gòu)建,采用 Java 編寫(xiě),并使用 Lucene 構(gòu)建索引、提供搜索功能,本文分步驟通過(guò)綜合案例給大家分享SpringBoot整合Elasticsearch的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2021-05-05
SpringBoot Entity中枚舉類(lèi)型詳細(xì)使用介紹
本文介紹SpringBoot如何在Entity(DAO)中使用枚舉類(lèi)型。(本文使用MyBatis-Plus)。在實(shí)際開(kāi)發(fā)中,經(jīng)常會(huì)遇到表示類(lèi)型或者狀態(tài)的情況,比如:有三種支付方式:微信、支付寶、銀聯(lián)。本文介紹如何這種場(chǎng)景的方案對(duì)比,并用實(shí)例來(lái)介紹如何用枚舉這種最優(yōu)雅的來(lái)表示2022-10-10
Java stringBuilder的使用方法及實(shí)例解析
這篇文章主要介紹了Java stringBuilder的使用方法及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Maven 項(xiàng)目生成jar運(yùn)行時(shí)提示“沒(méi)有主清單屬性”
這篇文章主要介紹了Maven 項(xiàng)目生成jar運(yùn)行時(shí)提示“沒(méi)有主清單屬性”,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和
這篇文章主要給大家介紹了關(guān)于java?stream實(shí)現(xiàn)分組BigDecimal求和以及自定義分組求和的相關(guān)資料,Stream是Java8的一大亮點(diǎn),是對(duì)容器對(duì)象功能的增強(qiáng),它專(zhuān)注于對(duì)容器對(duì)象進(jìn)行各種非常便利、高效的聚合操作或者大批量數(shù)據(jù)操作,需要的朋友可以參考下2023-12-12
Java8新特性之再見(jiàn)Permgen_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java8新特性之再見(jiàn)Permgen的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06

