LIst
List:是有序的,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素。
LIst集合又分ArrayList(数组集合)、LinkedList(链表集合)、Vector(向量集合)
ArrayList:
基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:先扩容再添加。因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会 涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能、甚至超过linkedList(需要创建大量的node对象)
LinkedList:
基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询:需要逐 一遍历遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大。另外不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexlOf对list进行了遍历,当结果为空时会遍历整个列表。
与ArrayList不同点:
1、两者底层实现方式不同,ArrayList底层是基于动态数组的数据结构实现的,而LinkedList底层是基于双向链表的数据结构实现的,这也是两者最本质的区别。
2、访问元素效率不同,对于访问集合中的元素,ArrayList要优于LinkedList,因为LinkedList底层是基于链表实现的,在查找元素时,只能慢慢移动指针,一个一个查找。
3、插入、删除效率不同,对于添加(add)和删除(remove)操作,LinkedList相比于ArrayList更快.因为LinkedList不需要像ArrayList一样改变数组的大小,也不需要在数组存储满时扩容,时间复杂度相较于ArrayList小一些。
4、所需内存不同,LinkedList相比于ArrayList需要更多的内存,因为ArrayList的每个索引的位置存储的是实际的数据。而LinkedList的每个节点存储的是实际数据,及其前后节点的位置,因此需要更大的存储空间。
Vector:与ArrayList继承的类和实现的接口一致。
与ArrayList不同点:
1、Vector中的public方法多数添加了synchronized关键字,以确保方法同步,也即是Vector线程安全,ArrayList线程不安全。
2、ArrayList扩展后数组大小为原数组长度的1.5倍,Vector扩展后数组大小为原数组长度+ capacityIncrement (扩展因子大于0时)或者原数组长度的2倍