JAVA的LIST接口的REMOVE重载方法调用原理解析
人气:0前言
说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动。
但是在写算法的时候,经常用到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。
您可能感兴趣的文章:
- Java contains用法示例
- 如何解决Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X
- java Iterator.remove()实例方法分析
- 浅谈Java list.remove( )方法需要注意的两个坑
- Java中List遍历删除元素remove()的方法
- java 较大数据量取差集,list.removeAll性能优化详解
- java ArrayList.remove()的三种错误用法以及六种正确用法详解
- Java中ArrayList在foreach里remove的问题详析
- Java 集合的Contains和Remove方法
加载全部内容