java集合类源码详解-ArrayList(3)-基于JDK8

之前已经学习过了两个构造函数,和扩容缩容的函数

ArrayList总共有三个构造函数,现在学习最后一个。

java集合类源码详解-ArrayList(1)

java集合类源码详解-ArrayList(2)

同样是写了测试代码,点击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多个方法,后续会继续学习。

后续楼主会继续学习集合类的源码,另外博客什么地方写错,请指出,大家一起学习进步!!  

猜你喜欢

转载自blog.csdn.net/qq_37889257/article/details/84328575
今日推荐