首先我们知道集合分为双列集合与单列集合,而单列集合又分为List和Set。
而list与set集合的区别是什么?
list集合是有索引的,允许存储重复元素,并且存取是有序的。
相反set集合没有索引,不能存储重复元素,存取无序。
而ArrayList,LinkedList和Vector都属于List集合,那么他们有什么区别和相同之处呢?
ArrayList与LinkedList:
相同:首先他们都是List集合,所以他们符合上面的特性。
不同:ArrayList底层使用数组存储数据,而LinkedList底层则使用双向链表来存储数据。
所以,ArrayList的随机访问与搜索速度较快,而LinkedList的增加删除速度则比较快。
由于LinkedList使用的是链表结构,所以比ArrayList相对来说更占用内存。
ArrayList:
ArrayList底层维护了一个Object类型的数组elementData,在创建对象时,如果不指定容量的话,则默认初始化数组容量为JDK1.7为10,JDK1.8中为0。如果指定容量,则数据容量为指定的capacuty。
在添加元素时,需要先判断是否需要扩容,如果不需要,则直接添加到相应位置,如果需要,则要先扩容操作再添加元素。如果是第一次需要扩容,则扩容大小为10,如果是多次扩容,大小则为原数组容量的1.5倍。
LinkedList:
由于是双向链表,所以其底层维护了两个节点类型的变量frist和last,分别指向头节点与末尾节点。当每次添加元素时,需要先封装成节点类型的对象,里面维护了一个前驱指针和一个后驱指针,分别指向前后节点。
Vector:
底层也使用数组存储数据,但是它支持线程同步,而ArrayList和LinkedList则不支持线程同步。也由于实现同步的开销,所以它的访问要比ArrayList要慢。
Vector的扩容是默认扩容一倍。Vector提供有indexOf接口,而ArrayList没有。而且Vector在创建对象时,默认构建的数组大小为10。