如上图:ArrayList, LinkedList, Vector, Stack是List4个常用的实现类。
ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。
LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率低。
Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。
Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。
ArrayList和Vector
1、ArrayLIst和Vector封装了一个动态再分配的Object[]数组。
2、每个ArrayLIst和Vector对象 有一个capacity属性用来表示它们所封装的Object[]数组的长度,当向ArrayLIst和Vector添加元素时,capacity会自动增加。
如果需向ArrayLIst和Vector添加大量元素时,可使用ensureCapacity方法一次性地增加capacity。
*void ensureCapacity(int i):把ArrayLIst和Vector的capacity增加i;
*void trimTOSize():调整ArrayLIst和Vector的capacity为列表当前大小,程序可调用方法来减少ArrayLIst和Vector对象存储空间。
ArrayList和Vector的区别:
1、 同步性:Vector是同步的,ArrayList是异步的
2、 数据增长:从内部实现机制来讲ArrayList和Vector都是使用数组来控制集合中的对象。当你向着两种类型增加元素的时候,如果元素的数目超出了内部数据目前的长度它们都需要扩展内部数据的长度,Vector缺省的情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中国保存大量的数据那么使用Vector有一些优势。
Stack
它是vector的子类,用于模拟栈这种数据结构,即“后进先出”。进栈出栈的都是Object,因此从栈中取出元素后必须做类型转换,除非你只是使用Object具有的操作。Stack提供了如下方法:
1、Object peek():返回栈的第一个元素,但并不将该元素出栈。
2、Object pop():返回栈的第一个元素,并将该元素出栈。
3、void push(Object item):将一个元素push进栈。
public static void main(String[] args) {
// TODO Auto-generated method stub
//新建一个stack集合
Stack v=new Stack();
//依次将3个元素push进栈
v.push("指南");
v.push("实战");
v.push("开发");
System.out.println(v);//输出[指南, 实战, 开发]
System.out.println(v.peek());//输出:开发
System.out.println(v);//依然输出[指南, 实战, 开发]
System.out.println(v.pop());//输出:开发
System.out.println(v);//输出[指南, 实战]
}
LinkedList
LinkedList既实现了List接口,又实现了Deque接口。即可以根据索引来随机访问集合中的元素,而Deque代表一个双向队列。
Deque接口里定义了一些可以双向操作队列的方法:
1、void addFirst(Object e):将指定元素插入该双向队列的开头。
2、void addLast(Object e):将指定元素插入该双向队列的末尾。
3、Iterator descengingIterator():返回以该双向队列对应的迭代器,该迭代器以逆向顺序来迭代元素。
4、Object getFirst():获取但不删除双向队列的第一个元素。
5、Object getLast():获取但不删除双向队列的最后一个元素。
6、boolean offerFirst(Object e):将指定的元素插入该队列的开头。
7、boolean offerLast(Object e):将指定的元素插入队列的末尾。
8、Object peekFirst():获取但不删除该队列的第一个元素,如果队列为空,则返回null。
9、Object peekLast():获取但不删除该队列的最后一个元素,如果队列为空,则返回null。
10、Object pollFirst():获取并删除该队列的第一个元素,如果队列为空,则返回null。
11、Object pollLast():获取并删除该队列的最后一个元素,如果队列为空,则返回null。
12、Object pop():pop出该队列所表示栈中的第一个元素。
13、void push z(Object e):将一个元素push进该队列所表示的栈中。
14、Object removeFirst():获取并删除该队列的第一个元素。
15、Object removeFirstOccurrence(Object o):删除该队列第一次出现的o对象。
16、removeLast():获取并删除该队列的最后一个元素。
17、Object removeLastOccurrence(Object o):删除该队列最后一次出现的o对象。
比较:
1、LinkedList与ArrayList、Vector的实现机制完全不同,ArrayList、Vector内部以数组的形式来保存集合中的元素,因此随机访问集合元素上有较好的性能
2、LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能差;但插入、删除时性能出色,因为只需改变指针地址即可。
3、Vector因为实现了线程同步功能,所以各方面性能都有所下降。
4、对于基于数组的集合,如ArrayList、Vector,其随机访问的速度比使用Iterator迭代访问的性能好,因随机访问会被映射成数组元素的访问。