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