一、List集合简介
List集合接口属于Collection接口的一个子接口,其实现类有LinkedList、ArrayList、Vector、Stack。List集合的特点是存储的元素是无序的、允许重复的。
二、ArrayList和Vector实现类
这两个实现类的底层都是基于数组实现的,所以他们实际上是封装了一个动态的、可再分配的数组。在构造ArrayList和Vector对象时,我们可以指定
initialCapacity
参数来设置该数组的长度,当我们向List中添加对象超过初始分配的空间时,系统会重新为我们开辟一段空间然后将原有集合中对象的存储地址转移到新的地址,显然这种操作是十分耗费性能的,在实际生产中我们应该尽可能地减少重分配次数。
如果在开始时就知道要存储多少元素,最好在创建List或Vector时指定
initialCapacity
。在一次增加大量元素时可以
事先
调用
void ensureCapacity(int minCapacity)
方法一次性增加大于等于
minCapacity
的空间。
ArrayList和Vector的区别:
Vector相比ArrayList是一个更古老的集合,他们之间最显著的区别便是Vector是线程安全的,而ArrayList则不是,因此Vector的性能要远低于ArrayList。Vector还有一个子类——Stack,这个栈结构同样也是线程安全、性能差,在实际开发中尽量避免使用Stack,如若使用栈结构可以考虑Queue集合中的ArrayDeque.
Arrays.asList()
方法返回的List对象是长度不可变的,只可访问不能增加或删除。
三、Queue集合
Queue接口下有PriorityQueue实现类,同时又派生出子接口Deque,Deque接口实际上是双端队列的接口,该接口的实现类有ArrayDeque、LinkedList。
ArrayDeque可以当作双端队列使用也可以当作栈使用,这个类提供了这两种数据结构的基本操作方法。与ArrayList相同,他也是基于数组实现的,当超过初始的分配空间(初始默认为16)时,系统会重新分配空间进行存储。
LinkedList既实现了List接口也实现了Deque接口,所以它可以当集合用、也可以当双端队列用、也可以当栈用。该类的实现是基于链表的形式,此集合在插入、删除元素时有良好的性能。
所有基于数组实现的集合在随机访问方面有着良好的性能,在遍历时可以采用for循环的方式,对于基于链表实现的集合可以采用Iterator的方式进行遍历。