之前已经学习过了两个构造函数,和扩容缩容的函数
ArrayList总共有三个构造函数,现在学习最后一个。
同样是写了测试代码,点击dbug
点击下一步。这个构造函数,是创建一个集合,并且把一个集合的元素,添加到这个集合
源码这里的形参是 Collection<? extends E> c
先看 ? extends E 这个泛型表示 是什么意思。
这个意思是 这里的泛型,必须是E或者是E的子类。这个概念叫做泛型固定上边界。
因为我们创建testArrayList时,new 的时候指定的泛型是Integer,所以E就是Integer,即 ? extends Integer
我们这里testArrayList指定的泛型是Integer,而myArrayList泛型也是Integer,根据上面的概念,myArrayList的泛型必须是testArrayList的泛型或者是其泛型子类。显然语法是正确的。
点击下一步,中间会先去执行父类的构造函数这里略。
此时,执行toArray()方法,注意,这个toArray()是ArrayList里面的。
点击下一步。会跳转到内部一个方法toArrayList。这个方法返回一个Object类型的数组,并包含其所有元素
注意:这个toArray()不一定会返回object类型的数组,可查看官方62060652bug
再次点击下一步,这里会将elementData.length(数组容量)赋给size(数组实际存储的数据数量)。
为什么要这样呢?因为此时的element的长度是根据函数形参的容器的长度。element的长度的根据传进来的容器的数据实际数量决定,所以此时的element.length和size其实应该是一样的。所以这里需要赋值。
赋完值后判断下,size是否为0
再次点击下一步,我们这里size显然不为0,这里会执行一个判断,因为toArray 返回的不一定是Object类型数组,所以,这里需要利用反射,判断elementData是否是 Object类型的数组,如果不是就用Arrays.copy()方法构造一个Object类型的数组再返回。
我们这里应该没问题
点击下一步。构造函数执行结束。
到这里ArrayList的三个构造函数和一些方法就结束了,但是还有很多方法,后续继续学习。
打钩的是已经学习了的,ArrayList大概有30多个方法,后续会继续学习。
后续楼主会继续学习集合类的源码,另外博客什么地方写错,请指出,大家一起学习进步!!