集合系列(1)----------ArrayList 源码分析

1、集合(Collection):存储对象的容器,代替数组,内部提供了很多便捷的方法,提高开发效率。

       Collection接口的所有元素是Object类。

       位于:java.util.*;

       结构如下:

集合系列(1)----------ArrayList 源码分析


2、List接口:特点:有序、有下标、可重复。

      本文章主要介绍List接口系列实现类:

      ArrayList: JDK1.2产物,操作速度快,底层数组实现,增删慢、查询快,线程不安全;   常用在展示层

      LinkedList:JDK1.2产物,操作速度慢,底层链表实现,增删快、查询慢,线程不安全 ;  常用在管理层

      Vector:JDK1.0  操作速度慢,底层数组实现,增删慢、查询快,线程安全


3、ArrryList类

1、ArrayList有两个构造方法:

集合系列(1)----------ArrayList 源码分析


集合系列(1)----------ArrayList 源码分析

 2、add()实现:

集合系列(1)----------ArrayList 源码分析


ensureExplicitCapacity(int minCapacity)判断是否需要扩容:

集合系列(1)----------ArrayList 源码分析

grow()方法实现扩容:

集合系列(1)----------ArrayList 源码分析集合系列(1)----------ArrayList 源码分析

数组扩容时使用Arrays.copyOf()方法

3、get(int i)

集合系列(1)----------ArrayList 源码分析

集合系列(1)----------ArrayList 源码分析

先判断要查找的下标是否超过实际存储数据的数组的长度;

4、E set(int i,E value)

集合系列(1)----------ArrayList 源码分析

5、E remove(int i)

集合系列(1)----------ArrayList 源码分析

注意:移除元素时,数组容量并不减少,仅仅实际长度减少

总结:ArrayList集合默认数组长度是10;

          它是个动态的数组,动态扩容需要数组copy,扩容原来的0.5倍,数组进行删除时,不改变其容量,

          若想改变其容量调trimToSize()  

            内部借助于一个数组实现 Object elementDate[]

            线程不安全,可以存储null

4、Vector

        是一个线程安全的类,但是操作效率不高,它与ArrayList的区别:可以认为是它在每个方法前面加上了synchronized,(锁标记)做到了同步线程安全。

        Vector扩容是扩容1倍;

5、我们如果想要ArrayList实现线程安全:

可以使用Collections类中的方法:List list = Collections.synchronizedList(new ArrayList(...));

另外,我们根据市场的调查,对一个集合的操作,读的操作次数远远远远远大于写操作,

所以,我们只需提高读操作,我们就可以说在操作效率得到了提高,

如果我们保证安全,保证效率的情况下,我们可以使用另一类:CopyOnWriteArrayList<E>()

以复制数组的方式,保证读效率最高。

6、LinkedList底层是个双向链表

可以使用Collections类中的方法:List list = Collections.synchronizedList(new LinkedList(...));

代码分析不做分析;