java的==運(yùn)算符和equals操作詳解
①chatgpt的解釋
在Java中,==和equals都是用于比較兩個(gè)對(duì)象的操作符,但它們的行為和用途有所不同。
==操作符:
對(duì)于基本數(shù)據(jù)類型,比較的是它們的值是否相等。例如,int a = 5; int b = 5; System.out.println(a == b); // 輸出true
對(duì)于引用類型,比較的是它們的引用是否相等,即是否指向同一個(gè)對(duì)象。例如,String str1 = "hello"; String str2 = "hello"; System.out.println(str1 == str2); // 輸出true
對(duì)于對(duì)象的比較,如果沒有重寫equals方法,默認(rèn)使用的也是==操作符進(jìn)行比較。
equals方法:
equals方法是Object類中定義的方法,用于比較兩個(gè)對(duì)象是否相等。默認(rèn)情況下,equals方法和==操作符的行為相同,即比較的是兩個(gè)對(duì)象的引用是否相等。
但是,equals方法可以被子類重寫,以實(shí)現(xiàn)自定義的相等比較邏輯。通常情況下,我們需要重寫equals方法來比較對(duì)象的內(nèi)容是否相等,而不僅僅是比較引用是否相等。
重寫equals方法時(shí),通常還需要重寫hashCode方法,以保證對(duì)象在放入哈希表等數(shù)據(jù)結(jié)構(gòu)時(shí)的正確性。
需要注意的是,對(duì)于基本數(shù)據(jù)類型,使用==操作符進(jìn)行比較是安全的。但對(duì)于引用類型,特別是自定義的類,通常需要使用equals方法來比較對(duì)象的內(nèi)容是否相等。在使用equals方法時(shí),需要注意遵循以下幾個(gè)原則:
- 自反性:x.equals(x)應(yīng)該返回true。
- 對(duì)稱性:如果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ì)象沒有被修改。
- 非空性:x.equals(null)應(yīng)該返回false。
②Object常用類
1.equals(Object obj)方法:
用于比較兩個(gè)對(duì)象是否相等。
默認(rèn)情況下,使用的是==操作符進(jìn)行比較,即比較兩個(gè)對(duì)象的引用是否相等。
通常需要在自定義的類中重寫equals方法,以實(shí)現(xiàn)自定義的相等比較邏輯。
重寫equals方法時(shí),通常還需要重寫hashCode方法,以保證對(duì)象在放入哈希表等數(shù)據(jù)結(jié)構(gòu)時(shí)的正確性。
2.hashCode()方法:
返回對(duì)象的哈希碼值。
哈希碼值用于在哈希表等數(shù)據(jù)結(jié)構(gòu)中快速定位對(duì)象。
默認(rèn)情況下,hashCode方法返回的是對(duì)象的內(nèi)存地址的整數(shù)表示。
重寫equals方法時(shí),通常也需要重寫hashCode方法,以保證相等的對(duì)象具有相同的哈希碼值。
3.toString()方法:
返回對(duì)象的字符串表示。
默認(rèn)情況下,返回的是對(duì)象的類名和哈希碼值的組合,例如"ClassName@hashCode"。
通常需要在自定義的類中重寫toString方法,以返回自定義的字符串表示。
4.getClass()方法:
返回對(duì)象的運(yùn)行時(shí)類。
可以用于獲取對(duì)象所屬的類的信息,例如類名、包名等。
5.clone()方法:
創(chuàng)建并返回對(duì)象的一個(gè)副本。
需要注意的是,該方法是淺拷貝,即只復(fù)制對(duì)象的引用,而不復(fù)制對(duì)象的內(nèi)容。
如果需要實(shí)現(xiàn)深拷貝,需要在自定義的類中重寫clone方法,并在其中進(jìn)行逐個(gè)成員變量的復(fù)制。
6.finalize()方法:
在對(duì)象被垃圾回收器回收之前調(diào)用。
可以在子類中重寫該方法以執(zhí)行對(duì)象的清理操作,例如釋放資源等。
7.notify()和notifyAll()方法:
用于在多線程環(huán)境下進(jìn)行線程間的通信。
notify()方法喚醒在該對(duì)象上等待的一個(gè)線程,notifyAll()方法喚醒所有在該對(duì)象上等待的線程。
這些方法必須在同步代碼塊或同步方法中調(diào)用,并且只能由持有該對(duì)象的鎖的線程來調(diào)用。
8.wait()方法:
使當(dāng)前線程進(jìn)入等待狀態(tài),直到其他線程調(diào)用該對(duì)象的notify()或notifyAll()方法喚醒它。
這個(gè)方法必須在同步代碼塊或同步方法中調(diào)用,并且只能由持有該對(duì)象的鎖的線程來調(diào)用。
需要注意的是,Object類中的這些方法都是被protected修飾的,因此只能在子類中訪問和使用。在實(shí)際開發(fā)中,我們通常會(huì)在自定義的類中重寫equals、hashCode和toString方法,以滿足具體的需求。
③==
==是一個(gè)比較運(yùn)算符;
(1)如果判斷基本類型,判斷的是值是否相等;
(2)如果判斷引用類型,判斷的是地址是否相等,即判斷是不是同一個(gè)對(duì)象;
④equals方法
(1)是一個(gè)方法,只能判斷引用類型
(2)Object類的equals方法默認(rèn)判斷的是地址是否相等,子類中往往重寫該方法,用于判斷內(nèi)容是否相等;
⑤如何查看jdk源碼:
在查看某個(gè)方法源碼時(shí),將光標(biāo)放在該方法處,輸入ctrl+b即可;或者是ctrl+左鍵 。
⑥lang包
java.lang包是Java語言的核心包之一,它包含了Java語言的基本類和接口。這個(gè)包中的類和接口是Java程序開發(fā)中最常用的,因此它們不需要顯式地導(dǎo)入就可以直接使用。
以下是java.lang包中一些常用的類和接口:
- Object類:Object類是所有類的根類,它定義了一些通用的方法,如equals()、hashCode()、toString()等。
- Class類:Class類表示Java中的類和接口,它提供了一些方法來獲取類的信息,如getName()、getSuperclass()、getInterfaces()等。
- String類:String類用于表示字符串,它提供了許多字符串操作的方法,如length()、charAt()、substring()等。
- StringBuilder和StringBuffer類:StringBuilder和StringBuffer類用于可變的字符串操作,它們提供了一系列方法來修改和操作字符串。
- Math類:Math類提供了一些數(shù)學(xué)運(yùn)算的方法,如abs()、sqrt()、sin()等。
- System類:System類提供了與系統(tǒng)相關(guān)的一些方法,如獲取當(dāng)前時(shí)間、獲取系統(tǒng)屬性、標(biāo)準(zhǔn)輸入輸出等。
Throwable類和Exception類:Throwable類是所有錯(cuò)誤和異常的基類,Exception類是所有可檢查異常的基類,它們提供了一些方法來處理錯(cuò)誤和異常。
Thread類和Runnable接口:Thread類和Runnable接口用于多線程編程,它們提供了創(chuàng)建和管理線程的方法。
除了上述提到的類和接口,java.lang包還包含了一些其他的類和接口,如ClassLoader類、Enum類、Iterable接口等。這些類和接口提供了Java語言的基本功能和特性,是Java程序開發(fā)中不可或缺的一部分。由于java.lang包中的類和接口在Java程序中經(jīng)常被使用,所以它們不需要顯式地導(dǎo)入就可以直接使用。
是的,String類是Object類的子類。在Java中,所有的類都直接或間接地繼承自O(shè)bject類。因此,String類繼承了Object類的所有方法,如equals()、hashCode()、toString()等。同時(shí),String類還提供了一些自己特有的方法,用于字符串的操作和處理。由于String類是Object類的子類,所以可以將String對(duì)象賦值給Object類型的變量,也可以將String對(duì)象作為參數(shù)傳遞給接受Object類型參數(shù)的方法。但需要注意的是,雖然String類繼承了Object類的方法,但它對(duì)其中的一些方法進(jìn)行了重寫,以實(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)類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+Vue+Redis實(shí)現(xiàn)單點(diǎn)登錄(一處登錄另一處退出登錄)
小編接到一個(gè)需求,需要實(shí)現(xiàn)用戶在瀏覽器登錄后,跳轉(zhuǎn)到其他頁面,當(dāng)用戶在其它地方又登錄時(shí),前面用戶登錄的頁面退出登錄,這篇文章主要介紹了SpringBoot+Vue+Redis實(shí)現(xiàn)單點(diǎn)登錄,需要的朋友可以參考下2019-12-12Spring?Data?JPA框架的Repository自定義實(shí)現(xiàn)詳解
Spring?Data?JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套?JPA?應(yīng)?框架,可使開發(fā)者?極簡的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問和操作,本篇我們來了解Spring?Data?JPA框架的Repository自定義實(shí)現(xiàn)2022-04-04SpringBoot集成Mybatis實(shí)現(xiàn)對(duì)多數(shù)據(jù)源訪問原理
本文主要分析討論在SpringBoot應(yīng)用中我們?cè)撊绾闻渲肧qlSessionFactoryBean對(duì)象,進(jìn)而實(shí)現(xiàn)對(duì)多個(gè)不同的數(shù)據(jù)源的操縱,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11Java實(shí)現(xiàn)Consul/Nacos根據(jù)GPU型號(hào)、顯存余量執(zhí)行負(fù)載均衡的步驟詳解
這篇文章主要介紹了Java實(shí)現(xiàn)Consul/Nacos根據(jù)GPU型號(hào)、顯存余量執(zhí)行負(fù)載均衡的步驟詳解,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04解決rror updating database.Cause:java.sql.SQLSyntaxE
這篇文章主要介紹了解決rror updating database.Cause:java.sql.SQLSyntaxErrorException問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05