List接口
List接口是Collection接口的子接口,与Set不同的是List中的元素是有序且允许重复的。所以List接口提供了根据索引获取元素。
ArrayList
ArrayList是基于对象数组实现的,ArrayList不是线程同步的,它允许重复元素,允许加入null值。默认扩容长度为原长度的1.5倍。
下面我们从ArrayList的构造方法说起
第一个无参的构造和传入collection的构造都是Collection接口中指定的,在Collection官方文档中可以看到。
译文:所有通用的集合实现类(通常通过集合的一个子接口间接实现集合)都应该提供两个“标准”构造函数:一个是void(无参数)构造函数,它创建一个空集合,另一个是具有一个Collection类型参数的构造函数。
然后最后一个构造方法是传入一个整型的initialCapacity,对底层的Object数组长度进行初始化。
注意:这里调用无参构造时,底层数组长度为0,初始化为ArrayList中的 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};只有在调用add方法时才会开始扩容,而调用第二个和第三个构造时,底层数组已经有了指定长度。
我们来看看调用无参构造时ArrayList中发生的变化。
在对Arraylist进行添加元素时其实只有两个核心方法
- ensureCapacityInternal(size + 1);确保当前的数组长度足够大,不够大则需要扩容。
- grow(int minCapacity);进行扩容操作的方法,默认是扩容到原来的1.5倍长度。
看过了ArrayList的核心内容扩容,那么我们再看看ArrayList中的主要方法。
1.添加元素
2.删除元素
3.修改元素
4.查询元素
5.状态判断
LinkedList
linkedlist底层是使用双向链表实现,所以linkedlist的构造方法并不能赋值初始容量,他的构造方法就是Collection中规定的两个构造器。需要注意的一点是linkedlist既实现了List接口,也实现了Queue接口,所以他也具有Queue的一些特性。他不仅有单纯的list的一些方法,也是实现了数据结构中栈和队列的一些操作方法。
关于栈的操作
关于队列的操作
Linkedlist也不是线程同步的,他允许重复元素,允许null值,并且linkedlist中不仅仅存储了First节点,还存储了当前节点,提高了尾部插入的效率。
Vector
Vector是Java中的元老类,他是线程安全的,其内部实现和ArrayList非常相似,只是在进行无参初始化的时候直接对底层数据进行了长度定义(ArrayList是在开始使用的时候才进行扩容),Vectory默认的扩容长度是两倍,当然你可以在创建时传入扩容增长capacityIncrement 。