JAVA的LIST接口的REMOVE重載方法調(diào)用原理解析
前言
說真的,平??丛创a都是自己看完自己懂,很少有寫出來的沖動(dòng)。
但是在寫算法的時(shí)候,經(jīng)常用到j(luò)ava中各種集合,其中也比較常用到remove方法。
remove有重載函數(shù),分別傳入?yún)?shù)是索引index或者數(shù)據(jù)Object(指定泛型后自動(dòng)轉(zhuǎn)換),如果指定泛型是其他數(shù)據(jù)類型還好,但是指定的是Integer或者是int的話,或者就有點(diǎn)懵了。
這曾經(jīng)也困惑過我,所以我就唯有用實(shí)踐解惑了。
測(cè)試類設(shè)計(jì)
測(cè)試類一
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è)試類二
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è)試類三
public class Text {
public void remove(Object object){
System.out.println("調(diào)用傳參為Object的remove方法");
}
}
結(jié)果
三個(gè)測(cè)試類分別傳入int,Integer,Object型變量,觀察效果。
測(cè)試類一
- 傳入類型為int:調(diào)用傳參為int的remove方法
- 傳入類型為Integer:調(diào)用傳參為Integer的remove方法
- 傳入類型為Object:調(diào)用傳參為Object的remove方法
測(cè)試類二
- 傳入類型為int:調(diào)用傳參為Integer的remove方法
- 傳入類型為Integer:調(diào)用傳參為Integer的remove方法
- 傳入類型為Object:調(diào)用傳參為Object的remove方法
測(cè)試類三
- 傳入類型為int:調(diào)用傳參為Object的remove方法
- 傳入類型為Integer:調(diào)用傳參為Object的remove方法
- 傳入類型為Object:調(diào)用傳參為Object的remove方法
從輸出結(jié)果可以看出,當(dāng)方法的傳參的類層級(jí)逐漸變高時(shí),層級(jí)較低的傳參會(huì)進(jìn)行向上轉(zhuǎn)型適應(yīng)傳參的需要。
原因分析
下面我們先反編譯各測(cè)試類的源碼,結(jié)果如下
測(cè)試類一
invokevirtual #11 // Method remove:(I)V
invokevirtual #15 // Method remove:(Ljava/lang/Integer;)V
invokevirtual #18 // Method remove:(Ljava/lang/Object;)V
測(cè)試類二
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è)試類三
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通過在編譯時(shí)確定調(diào)用的傳參類型,靜態(tài)分派到具體方法的。
所以在前言中的困惑已經(jīng)解除了,就是由于jvm中靜態(tài)分派的實(shí)現(xiàn),調(diào)用次序是int->Integer->Object。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java通過導(dǎo)出超大Excel文件解決內(nèi)存溢出問題
導(dǎo)出excel是咱Java開發(fā)的必備技能,下面這篇文章主要給大家介紹了關(guān)于Java通過導(dǎo)出超大Excel文件解決內(nèi)存溢出問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
springboot內(nèi)置tomcat之NIO處理流程一覽
這篇文章主要介紹了springboot內(nèi)置tomcat之NIO處理流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
前后端項(xiàng)目分離解決cors錯(cuò)誤的方法詳解
隨著前后端分離技術(shù)的越來越盛行,跨域問題也逐漸凸顯了出來,下面這篇文章主要給大家介紹了關(guān)于前后端項(xiàng)目分離解決cors錯(cuò)誤的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
Spring Cloud @RefreshScope 原理及使用
這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
如何構(gòu)建可重復(fù)讀取inputStream的request
這篇文章主要介紹了如何構(gòu)建可重復(fù)讀取inputStream的request,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Intellij IDEA如何去掉@Autowired 注入警告的方法
這篇文章主要介紹了Intellij IDEA如何去掉@Autowired 注入警告的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
JAVA代碼調(diào)用ffmpeg程序進(jìn)行視頻轉(zhuǎn)碼和推流方式
本文介紹了如何通過Java代碼調(diào)用FFmpeg進(jìn)行多媒體視頻處理,包括兩種方式:使用第三方封裝的jar包和使用ProcessBuilder類創(chuàng)建進(jìn)程,兩種方式各有優(yōu)缺點(diǎn),選擇時(shí)需根據(jù)具體需求和場(chǎng)景2025-02-02
詳解Java數(shù)據(jù)結(jié)構(gòu)之平衡二叉樹
平衡二叉樹(Balanced?Binary?Tree)又被稱為AVL樹(有別于AVL算法),且具有以下性質(zhì):它是一?棵空樹或它的左右兩個(gè)子樹的高度差的絕對(duì)值不超過1,并且左右兩個(gè)子樹都是一棵平衡二叉樹。本文將詳解介紹一下平衡二叉樹的原理與實(shí)現(xiàn),需要的可以參考一下2022-02-02

