JAVA的LIST接口的REMOVE重载方法调用原理解析

这篇文章主要介绍了JAVA的LIST接口的REMOVE重载方法调用原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动。但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法。remove有重载函数,分别传入参数是索引index或者数据Object(指定泛型后自动转换),如果指定泛型是其他数据类型还好,但是指定的是Integer或者是int的话,或者就有点懵了。这曾经也困惑过我,所以我就唯有用实践解惑了。测试类设计

测试类一

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方法"); } }

测试类三

public class Text { public void remove(Object object){ System.out.println("调用传参为Object的remove方法"); } }

结果

三个测试类分别传入int,Integer,Object型变量,观察效果

测试类一

传入类型为int:调用传参为int的remove方法

传入类型为Integer:调用传参为Integer的remove方法

传入类型为Object:调用传参为Object的remove方法

测试类二

传入类型为int:调用传参为Integer的remove方法

传入类型为Integer:调用传参为Integer的remove方法

传入类型为Object:调用传参为Object的remove方法

测试类三

传入类型为int:调用传参为Object的remove方法

传入类型为Integer:调用传参为Object的remove方法

传入类型为Object:调用传参为Object的remove方法

输出结果可以看出,当方法的传参的类层级逐渐变高时,层级较低的传参会进行向上转型适应传参的需要。

原因分析

下面我们先反编译各测试类的源码,结果如下

测试类一

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

可以看出,反编译代码中都是调用实例方法的命令,所以结果中自动"向上转型"其实是jvm的功劳。jvm通过在编译时确定调用的传参类型,静态分派到具体方法的。

所以在前言中的困惑已经解除了,就是由于jvm中静态分派的实现,调用次序是int->Integer->Object。

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...