JAVAのLISTインターフェースのREMOVEの重荷重方法の呼び出し原理解析


前言
本当のことを言うと、普段はソースコードを見て自分で分かります。
しかし、アルゴリズムを書く時は、javaにおける様々な集合をよく使います。
removeには重負荷関数があり、それぞれの着信パラメータはインデックスindexまたはデータObject(汎型指定後自動変換)であり、指定された汎型が他のデータタイプであれば良いですが、指定されたのはIntegerまたはintであれば、あるいは少し愚昧です。
これはかつて私にも困惑したことがあります。だから、私は実践で困惑を解きます。
テストクラスの設計
テストクラス1

public class Text {

 public void remove(int index){
  System.out.println("     int remove  ");
 }

 public void remove(Integer object){
  System.out.println("     Integer remove  ");
 }

 public void remove(Object object){
  System.out.println("     Object remove  ");
 }
}
テストクラス二

public class Text {
 
 public void remove(Integer object){
  System.out.println("     Integer remove  ");
 }

 public void remove(Object object){
  System.out.println("     Object remove  ");
 }
}
テストクラス3

public class Text {

 public void remove(Object object){
  System.out.println("     Object remove  ");
 }
}
結果
三つのテストクラスはそれぞれintに入ります。Integer、Object型変数、効果を観察します。
テストクラス1
  • 着信タイプはintである:転送がintであるremove方法を呼び出す
  • 着信タイプはIntegerです。Integerとして知られるremove方法を呼び出します。
  • 着信タイプはObject:Objectに伝わるremove方法を呼び出します。
  • テストクラス二
  • 着信タイプはint:Integerとしてのremoveメソッドを呼び出す
  • です。
  • 着信タイプはIntegerです。Integerとして知られるremove方法を呼び出します。
  • 着信タイプはObject:Objectに伝わるremove方法を呼び出します。
  • テストクラス3
  • 着信タイプはint:Objectに伝えられるremove方法を呼び出す
  • 着信タイプはIntegerです。Objectに伝えられたremove方法を呼び出します。
  • 着信タイプはObject:Objectに伝わるremove方法を呼び出します。
  • 出力結果から,方法のクラスレベルが徐々に高くなると,レベルの低いインペルダウンがアップコンバートされてインペルダウンに適応する必要があることがわかった。
    原因分析
    次は各テストのソースコードをコンパイルします。結果は次の通りです。
    テストクラス1invokevirtual #11 // Method remove:(I)Vinvokevirtual #15 // Method remove:(Ljava/lang/Integer;)Vinvokevirtual #18 // Method remove:(Ljava/lang/Object;)Vテストクラス二invokevirtual #11 // Method remove:(Ljava/lang/Integer;)Vinvokevirtual #11 // Method remove:(Ljava/lang/Integer;)Vinvokevirtual #17 // Method remove:(Ljava/lang/Object;)Vテストクラス3invokevirtual #10 // Method remove:(Ljava/lang/Object;)Vinvokevirtual #10 // Method remove:(Ljava/lang/Object;)Vinvokevirtual #10 // Method remove:(Ljava/lang/Object;)V逆コンパイルコードはいずれも例示的な方法を呼び出すコマンドであることから、結果の自動的な「アップコンバート」はjvmのおかげであると考えられます。jvmは、コンパイル時に呼び出した参照タイプを決定することにより、静的に特定の方法に割り当てられる。
    前文での戸惑いが解消されたのは、jvmでの静的な分派が実現したため、呼び出し順序はint->Integer->Objectとなっています。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。