初探Java源码之ArrayList

来源:互联网 发布:淘宝网页显示不正常 编辑:程序博客网 时间:2024/06/06 00:46
AegonJAVA 2017-10-10 15:03

前言

在我们的日常开发中,集合类是我们基本上每个人都会用经常用到的东西,用着用着,突然有一天我心生好奇,那么java集合类的这些源码是什么呢?那么我打算接下来一个一个的查看一些常用的类源码争取达到心中有数的水平~~本文源码均来自Java 8

总体介绍

Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。Set和List两个类继承于它。Set中不能包含重复的元素,也没有顺序来存放。而List是一个有序的集合,可以包含重复的元素。

而Map又是另一个接口,它和Collection接口没有关系。Map包含了key-value键值对,同一个Map里key是不能重复的,而不同key的value是可以相同的。

在这里借用一张别人总结的对比图进行总结

初探Java源码之ArrayList

集合类对比

(上图来源:http://www.cnblogs.com/leeplogs/p/5891861.html)

具体的各个类的实现子类在这就不在具体介绍,网上已经有很多介绍的文章,就不在这里再展开介绍。今天我们来专门看看ArrayList的源码。


成员变量

首先我们来看看ArrayList的成员变量:

初探Java源码之ArrayList

可以看到主要的几个成员变量如上(跟进继承的父类,父父类直到根父类都没有成员变量)。我们来一一介绍一下。首先是一个常量DEFAULT_CAPACITY,根据注释表示默认的长度为10。然后是一个EMPTY_ELEMENTDATA的常量object数组,只是空有其表没有内容。然后是一个object数组elementData。这个就是最重要的成员了,通过注释我们可以看到这表示这个数组用来存储我们的数据。也就是说,我们代码中的add的数据都会放在这个数组里面。那么由此我们可知,ArrayList内部是由数组实现。再看最后一个变量,int类型的size。第一眼还以为是elementData数组的长度。仔细看注释,才发现它表示的是elementData数组里面包含的数据长度。

构造函数

介绍完了成员变量,我们来看看构造方法:

初探Java源码之ArrayList

我们看到主要有三个构造方法。

第一个构造方法需要传入一个int类型的变量。表示我们实例化一个ArrayList的时候想让ArrayList的初始化长度为多少。然后如果该变量大于0,那么new一个长度为传入值的对象数组。如果传入为0,那么等于EMPTY_ELEMENTDATA。这个变量我们上面讲过,就是实例化一个对象数组,内容为空。如果小于0,那么抛出异常。

第二个构造方法是无参构造方法,直接等于DEFAULTCAPACITY_EMPTY_ELEMENTDATA。没有其他的好说的。

第三个则我们另外一种常见的使用方法,比如处理化AList的时候想把BList的值传给AList。那么使用如下代码:

List<Integer> AList = new ArrayList<>(BList);

我们看看构造函数做了什么。我们看到首先调用了c.toArray()方法将我们传入的集合元素变成一个数组来赋值给elementData数组。然后判断elementData数组里面是否有数据元素,如果有,那么再判断elementData数组类型是否为Object[],不是的话,转为Object[]类型。如果没有元素,那么直接赋值为EMPTY_ELEMENTDATA。

至此三个构造方法就已经分析完了,基本上没有什么难度。



本文转自【简书-晨心w】:http://www.jianshu.com/p/d49e4f5dc4c1

原创粉丝点击