JAVA的LIST接口的REMOVE重載方法調(diào)用原理解析
前言
說真的,平常看源碼都是自己看完自己懂,很少有寫出來的沖動。
但是在寫算法的時候,經(jīng)常用到j(luò)ava中各種集合,其中也比較常用到remove方法。
remove有重載函數(shù),分別傳入?yún)?shù)是索引index或者數(shù)據(jù)Object(指定泛型后自動轉(zhuǎn)換),如果指定泛型是其他數(shù)據(jù)類型還好,但是指定的是Integer或者是int的話,或者就有點懵了。
這曾經(jīng)也困惑過我,所以我就唯有用實踐解惑了。
測試類設(shè)計
測試類一
public class Text { public void remove(int index){ System.out.println("調(diào)用傳參為int的remove方法"); } public void remove(Integer object){ System.out.println("調(diào)用傳參為Integer的remove方法"); } public void remove(Object object){ System.out.println("調(diào)用傳參為Object的remove方法"); } }
測試類二
public class Text { public void remove(Integer object){ System.out.println("調(diào)用傳參為Integer的remove方法"); } public void remove(Object object){ System.out.println("調(diào)用傳參為Object的remove方法"); } }
測試類三
public class Text { public void remove(Object object){ System.out.println("調(diào)用傳參為Object的remove方法"); } }
結(jié)果
三個測試類分別傳入int,Integer,Object型變量,觀察效果。
測試類一
- 傳入類型為int:調(diào)用傳參為int的remove方法
- 傳入類型為Integer:調(diào)用傳參為Integer的remove方法
- 傳入類型為Object:調(diào)用傳參為Object的remove方法
測試類二
- 傳入類型為int:調(diào)用傳參為Integer的remove方法
- 傳入類型為Integer:調(diào)用傳參為Integer的remove方法
- 傳入類型為Object:調(diào)用傳參為Object的remove方法
測試類三
- 傳入類型為int:調(diào)用傳參為Object的remove方法
- 傳入類型為Integer:調(diào)用傳參為Object的remove方法
- 傳入類型為Object:調(diào)用傳參為Object的remove方法
從輸出結(jié)果可以看出,當(dāng)方法的傳參的類層級逐漸變高時,層級較低的傳參會進行向上轉(zhuǎn)型適應(yīng)傳參的需要。
原因分析
下面我們先反編譯各測試類的源碼,結(jié)果如下
測試類一
invokevirtual #11 // Method remove:(I)V
invokevirtual #15 // Method remove:(Ljava/lang/Integer;)V
invokevirtual #18 // Method remove:(Ljava/lang/Object;)V
測試類二
invokevirtual #11 // Method remove:(Ljava/lang/Integer;)V
invokevirtual #11 // Method remove:(Ljava/lang/Integer;)V
invokevirtual #17 // Method remove:(Ljava/lang/Object;)V
測試類三
invokevirtual #10 // Method remove:(Ljava/lang/Object;)V
invokevirtual #10 // Method remove:(Ljava/lang/Object;)V
invokevirtual #10 // Method remove:(Ljava/lang/Object;)V
可以看出,反編譯代碼中都是調(diào)用實例方法的命令,所以結(jié)果中自動"向上轉(zhuǎn)型"其實是jvm的功勞。jvm通過在編譯時確定調(diào)用的傳參類型,靜態(tài)分派到具體方法的。
所以在前言中的困惑已經(jīng)解除了,就是由于jvm中靜態(tài)分派的實現(xiàn),調(diào)用次序是int->Integer->Object。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解JVM基礎(chǔ)之字節(jié)碼的增強技術(shù)
字節(jié)碼增強技術(shù)就是一類對現(xiàn)有字節(jié)碼進行修改或者動態(tài)生成全新字節(jié)碼文件的技術(shù)。接下來,我們將從最直接操縱字節(jié)碼的實現(xiàn)方式開始深入進行剖析,感興趣的可以了解一下2022-10-10Java網(wǎng)絡(luò)編程之簡單的服務(wù)端客戶端應(yīng)用實例
這篇文章主要介紹了Java網(wǎng)絡(luò)編程之簡單的服務(wù)端客戶端應(yīng)用,以實例形式較為詳細(xì)的分析了java網(wǎng)絡(luò)編程的原理與服務(wù)器端客戶端的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04使用eclipse + maven一步步搭建SSM框架教程詳解
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三個開源框架整合而成,常作為數(shù)據(jù)源較簡單的web項目的框架.這篇文章主要介紹了eclipse + maven搭建SSM框架 ,需要的朋友可以參考下2017-11-11Java實現(xiàn)在Word中嵌入多媒體(視頻、音頻)文件
這篇文章主要介紹了Java如何實現(xiàn)在Word中嵌入多媒體(視頻、音頻)文件,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)java有一定的幫助,感興趣的同學(xué)可以了解一下2021-12-12SpringBoot MainApplication類文件的位置詳解
這篇文章主要介紹了SpringBoot MainApplication類文件的位置詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Spring?Boot將@RestController誤用于視圖跳轉(zhuǎn)問題解決
這篇文章主要為大家介紹了Spring?Boot將@RestController誤用于視圖跳轉(zhuǎn)問題解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06