集合系列(1)----------ArrayList 源码分析
1、集合(Collection):存储对象的容器,代替数组,内部提供了很多便捷的方法,提高开发效率。
Collection接口的所有元素是Object类。
位于:java.util.*;
结构如下:
2、List接口:特点:有序、有下标、可重复。
本文章主要介绍List接口系列实现类:
ArrayList: JDK1.2产物,操作速度快,底层数组实现,增删慢、查询快,线程不安全; 常用在展示层
LinkedList:JDK1.2产物,操作速度慢,底层链表实现,增删快、查询慢,线程不安全 ; 常用在管理层
Vector:JDK1.0 操作速度慢,底层数组实现,增删慢、查询快,线程安全
3、ArrryList类
1、ArrayList有两个构造方法:
2、add()实现:
ensureExplicitCapacity(int minCapacity)判断是否需要扩容:
grow()方法实现扩容:
数组扩容时使用Arrays.copyOf()方法
3、get(int i)
先判断要查找的下标是否超过实际存储数据的数组的长度;
4、E set(int i,E value)
5、E remove(int i)
注意:移除元素时,数组容量并不减少,仅仅实际长度减少
总结: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(...));
代码分析不做分析;