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倍

 

posted @ 2022-05-09 13:51  昵称已被使用!!!  阅读(56)  评论(0编辑  收藏  举报