java集合之List集合

关于集合以前也总结过一点,一直忘记摘录一下集合的继承关系图。

核心收集接口封装了不同类型的集合,如下图所示。这些接口允许集合被独立地操纵它们表示的细节。核心收集接口是Java集合框架的基础。正如您在下图中所看到的,核心收集接口形成了一个层次结构。如图所示:

java集合之List集合

java集合之List集合

这是list集合的三种具体实现我们只看一下arrayList  然后跟Vector做一下对比即可。ArrayList为我们最常用的集合之一。

List接口的可调整大小数组实现实现所有可选的列表操作,并允许所有元素,包括 null除了实现List接口之外,该类还提供了一些方法来控制用于内部存储列表的数组大小。(这个类大致相当于 Vector,除了它是不同步的。)

下面我们通过源码分析一下ArrayList的初始化是怎么样的一个过程。

首先我们new 一个新的arrayList集合出,跟进看一下这个arrayList是如何初始化的以及初始化容量是多少。

java集合之List集合

构造一个空的列表,初始化容量为10.没看出这个10有什么特别的意义。

java集合之List集合

我们看到初始化无参数的构造函数在jdk1.8,并没有明确指出容量是10.那么这个容量10是在哪里赋值的呢?我们首先先来看一下this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

这两个分别指向的什么代表什么意思?

java集合之List集合

这两个做了一个区分,其实还是一个object的数组,因为是数组所有操作数据比较快性能好。

上面说了:当第一个元素被添加的时候会给elementData赋值为默认的容量也就是容器的初始化容量,下面我们看一下当添加第一个元素的时候是什么样子的:

java集合之List集合

我们找到add方法,举例我们添加一个元素String的元素 zhangsan,来分析一下arrayList容器是如何放入这个元素的,以及当容器满了之后如何扩容。

java集合之List集合

我们看到在未添加任何元素的时候,这个集合大小为0,当我们添加一个元素的时候,看一下是什么情况:

java集合之List集合

这样我们看到已经初始化为一个Object为10的数组。并且添加了一个元素zhangsan。然后我们通过代码看一下是如何初始化的,多说一句,在jdk1.7和之前初始化的时候是不一样的,有兴趣的可以去看一下7的源码,那时候还是直接初始化一个大小为10的Object数组。

好了我们看一下下面的具体实例化的代码分析一下:

java集合之List集合

size为arrayList的大小包含的元素数量,我们现在就当做添加的是第一个元素:zhangsan,那么现在e=zhangsan。

目前size还是= 0 ,传入到这个ensureCapacityInternal(size + 1);为数字1其实。下面看一下这个方法。

java集合之List集合

现在mincapacity = 1, elsementData 现在是一个Object[] and DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一个Object[]所以添加第一个数据的时候,if里面是表达式是相等的,是一个true,进入里面我们看一下里面的表达式是什么意思。

java集合之List集合

容器默认的大小,现在minCapacity = 1;

那么通过minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);表达式

java集合之List集合

返回给我们的数据a=10,b=1所以返回了10。所以minCapacity = 10。

java集合之List集合

传入的10目前指定是大于0的值。

java集合之List集合

看一下上面这个方法目前minCapacity = 10 。 elementData = 0 。最后确定elementData数组的长度并且把第一个元素复制到新的集合里面。

那么下面我们看一下如若到了10个元素,集合石如何扩容的:

int oldCapacity = elementData.length; == 10

int newCapacity = oldCapacity + (oldCapacity >> 1); oldCapacity >> 1 = 5

newCapacity  = 15;

然后走copy的过程并设置这个容器的容量为15第一次扩容,这个就是扩容的机制。

下面通过arrayList和Vector做一个对比总结一下arrayList:

首先不同点:

1.arrayList性能要比Vector要好,因为Vector是线程安全的一个集合,方法加了同步,所以相对性能要低于arrayList。

2.arrayList和vector都是默认自动增长的集合,然而arrayList到了最大值,增长百分之50,而vector则增长一倍。

忘记说了在最后补充一点,vector还有一个作为栈来用的子类:stack,那么这又简答解释一下什么是栈:栈是一种数据结构,表示只能在数据的一段进行操作,为先进后出的一种实现。它是vector的一个子类所以她也是线程安全的,性能比较低的。