对Java的List转Array的源码一点思考
在Java里面,List转为Array是调用的Java的一个Arrays.copyOf()这个方法,查看了下源代码:
1 | public Object[] toArray() { |
在这里需要注意的是在copyOf()方法中的那个三元表达式,也就是说在这里无论执行的true还是false,都会返回一个新的数组对象。而在这里有一行代码就是((Object)newType == (Object)Object[]).class),这一句看起来没什么,其实可以看参数
Class<? extends T[]> newType和
Object会发现这两个数组对象都被强转成了
Object,而
==`比较符是不能比较不同类型的。例如:
1 | public void te(){ |
上面的代码在代码的编译期就会被提示==
不可以适用于上述的两种情况.如下:
那么回到正题,这里其实仔细看就会发现无论是否相等,在这里三元表达式中,都会返回一个新的数组对象,那么在这里加入了三元表达式的想法是newInstance()
是通过反射进行创建的,而new Object[]
则是非反射创建的.
Because reflection involves types that are dynamically resolved, certain Java virtual machine optimizations can not be performed. Consequently, reflective operations have slower performance than their non-reflective counterparts, and should be avoided in sections of code which are called frequently in performance-sensitive applications.
所以在这里加一个判断使代码尽量通过非反射的方式进行创建。最后调用System.arraycopy()
,但是这里的都已经强转成了Object,应该不会有失败的情况
对Java的List转Array的源码一点思考
https://somersames.github.io/2018/04/07/对Java的List转Array的源码一点思考/