Java中==與equals()及hashcode()三者之間的關(guān)系詳解_第1頁
Java中==與equals()及hashcode()三者之間的關(guān)系詳解_第2頁
Java中==與equals()及hashcode()三者之間的關(guān)系詳解_第3頁
Java中==與equals()及hashcode()三者之間的關(guān)系詳解_第4頁
Java中==與equals()及hashcode()三者之間的關(guān)系詳解_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Java中==與equals()及hashcode()三者之間的關(guān)系詳解目錄1.==2.equals()3.重寫equals()4.equals()比較流程5.hashcode()

1.==

=為賦值運算符,==為比較運算符,僅比較對象的內(nèi)存地址,無法比較真正意義上的相等!

JDK里的equals方法就是通過==來實現(xiàn)的比較對象的內(nèi)存地址

以Integer為例

Integera=127;

Integerb=127;

System.out.println(a==b);//true

Integerc=128;

Integerd=128;

System.out.println(c==d);//false

這里也是通過==引出一個知識點,一個數(shù)值之差為啥導致結(jié)果不一樣?在[-128,127]的區(qū)間內(nèi)Integera=127;由于設(shè)計了緩存,而后的Integerb=127;就是直接利用的緩存里的數(shù)值對象,所以通過==比較的結(jié)果為true,因為他們本質(zhì)還是一個數(shù)值對象

而Integerc=128;Integerd=128;就沒這樣幸運了,超過了緩存區(qū)間會重新new出對象,以至于兩者雖然數(shù)值相同但是地址不同

所以啊,==比較的是地址!也只是地址!

在前面==的基礎(chǔ)上,再來看equals()

2.equals()

以一個String類型的變量為例,當我們來使用equals()比較兩個對象時,結(jié)果肯定是false,因為equals()方法比較的是內(nèi)存地址,這里的person1,person2均是兩次new出來的,所以地址肯定是不相同的,而person1,person3指向同一空間地址一定是相同的

Personperson1=newPerson("lyy");

Personperson2=newPerson("lyy");

Personperson3=person1;

System.out.println(person1.equals(person2));//false

System.out.println(person1.equals(person3));//true

在不重寫的情況下,我們Ctrl+B看一下equals()的源碼:

publicbooleanequals(Objectobj){

return(this==obj);

顯而易見的是(this==obj)是該方法的核心,而==又是兩個對象比較的方式,==嘛比的是內(nèi)存地址,懂的都懂噢

3.重寫equals()

記不記得你在刷面經(jīng)或者短視頻的時候經(jīng)??吹降囊痪湓挶容^兩個對象的內(nèi)容是否相等時我們要重寫equals()方法!

這是為何?那我們不妨來重寫一下equals()試試水

@Override

publicbooleanequals(Objectobj){

if(this==obj){

returntrue;

if(obj==null||getClass()!=obj.getClass()){

returnfalse;

Personperson=(Person)obj;

returnObjects.equals(name,);

重寫過equals后,原有的兩者就已發(fā)生翻天覆地的變化,從原來的比較內(nèi)存地址比較對象內(nèi)容,這是一件很神奇的事情,因為實現(xiàn)了比較不同對象的相同或者不同內(nèi)容!

重寫之后:

具體是如何實現(xiàn)的呢?就像下面這樣

4.equals()比較流程

下面我們來探索一下重寫的equals()是如何比較內(nèi)容的:

通過debug來深入理解一下

下面來看一下debug過程中變量情況

總的來說,通過debug,重寫equals()來比較不同變量的不同或者相同內(nèi)容得到了進一步論證!

5.hashcode()

我們在IDEA中通過CTRL+O的快捷鍵重寫hashcode()時它上面所屬的類是誰?

java.lang.Object!

顯而易見,該方法是Object類所定義的方法,作用是返回對象的哈希值返回值的類型為int(哈希值的作用是確定該對象在哈希表中的位置),曾經(jīng)有這樣一句流川千古的話:你必須在每個重寫equals()的類中重寫一遍hashcode()方法

如果不這樣做將會違反Object.hashcode()的一般約定,這會阻止lei與所有基于散列的集合(比如hashmap,hashset)一起正常工作。為啥?因為hashmap,hashset等基于散列的集合中,會使用對象的hashcode值來確定該對象應(yīng)該如何存儲到集合中,并且再次使用hashcode來定位對象在集合中的位置

那么

在一個類中重寫了equals()但沒重寫hashcode()會出現(xiàn)啥情況呢?

我們來通過一個例子試試水~

嘗試把對象都放入一個不能重復的set里,然后看集合的長度來判斷兩個對象是否相等!

publicclassequals_hashcode{

publicstaticvoidmain(String[]args){

Personperson1=newPerson("lyy");

Personperson2=newPerson("lyy");

HashSetPersonset=newHashSet();

set.add(person1);

set.add(person2);

System.out.println(set.size());

classPerson{

publicStringname;

publicPerson(Stringname){

=name;

@Override

publicbooleanequals(Objectobj){

if(this==obj){

returntrue;

if(obj==null||getClass()!=obj.getClass()){

returnfalse;

Personperson=(Person)obj;

returnObjects.equals(name,);

@Override

publicinthashCode(){

returnObjects.hash(name);

}

情況一:

當只重寫了equals()方法時運行的結(jié)果為2,由此得出兩個對象不相等!

情況二:

當既重寫了equals()和hashcode()后運行結(jié)果為1,所以兩個對象相等!

由此得出

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論