您的位置:首页 > 娱乐 > 八卦 > ArrayList,Vector, LinkedList的存储性能和特性举例说明

ArrayList,Vector, LinkedList的存储性能和特性举例说明

2024/12/22 17:15:22 来源:https://blog.csdn.net/codedadi/article/details/140168583  浏览:    关键词:ArrayList,Vector, LinkedList的存储性能和特性举例说明

ArrayList、Vector、LinkedList是Java中常用的三种集合类型,它们各自具有不同的存储性能和特性。下面将分别举例说明这三种集合的存储性能和特性:

ArrayList

存储性能与特性:

底层实现:ArrayList底层是通过数组实现的,它维护了一个动态的数组来存储元素。这个数组的大小会根据元素的增加而自动扩容。

查询性能:由于ArrayList的元素在内存中是连续存储的,因此可以通过索引直接访问元素,这使得它的查询效率非常高,时间复杂度为O(1)。

插入与删除性能:插入和删除操作需要移动数组中的元素来保持连续性,这可能会导致效率较低,特别是在列表的开头或中间位置进行插入和删除操作时。时间复杂度为O(n),其中n是列表的长度。

扩容机制:当数组需要增长时,新的容量按如下公式获得:新容量=(旧容量*3)/2+1,也就是说每一次容量大概会增长50%。

线程安全:ArrayList不是线程安全的。如果在多线程环境下使用,需要外部同步或使用Collections.synchronizedList进行包装。

举例说明:

假设有一个ArrayList存储了100个元素,现在要在索引50的位置插入一个新元素。这个操作会涉及到将索引50及之后的所有元素向后移动一位,以腾出空间给新元素,这个过程的时间复杂度为O(n)。但是,如果仅仅是查询索引50的元素,那么可以直接通过索引访问,时间复杂度为O(1)。

Vector

存储性能与特性:

底层实现:Vector与ArrayList类似,也是通过数组实现的。

线程安全:与ArrayList不同,Vector是线程安全的。它的所有公开方法都使用了synchronized关键字进行同步,这保证了在多线程环境下操作的安全性,但同时也降低了性能。

扩容机制:Vector的扩容机制与ArrayList不同。如果指定了增长系数且有效(大于0),则每次容量不足时,“新的容量”=“原始容量+增长系数”。如果未指定或增长系数无效(小于等于0),则“新的容量”=“原始容量x 2”。

举例说明:

由于Vector是线程安全的,因此它适用于需要在多线程环境下共享数据的场景。但是,由于同步的开销,Vector的性能通常比ArrayList低。例如,在多线程环境下对Vector进行迭代时,需要外部同步来防止并发修改异常。

LinkedList

存储性能与特性:

底层实现:LinkedList是通过双向链表实现的,它将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构。

查询性能:由于LinkedList不是连续存储的,因此通过索引访问元素时需要进行前向或后向遍历,这导致查询效率较低,时间复杂度为O(n)。

插入与删除性能:插入和删除操作只需要修改相关节点的指针,而不需要移动元素,因此效率较高,时间复杂度为O(1)(在已知索引位置的情况下)。但是,如果不知道索引位置,则需要先遍历链表找到该位置,此时时间复杂度为O(n)。

举例说明:

假设有一个LinkedList存储了100个元素,现在要在链表中间位置插入一个新元素。这个操作只需要找到中间位置的节点,并修改相关节点的指针即可,这个过程的时间复杂度为O(n)(因为需要遍历链表找到中间位置)。但是,一旦找到了插入位置,实际的插入操作(即修改指针)是非常快的,时间复杂度为O(1)。相比之下,如果在ArrayList的中间位置插入元素,则需要移动大量元素来腾出空间,效率较低。

综上所述,ArrayList、Vector、LinkedList各有其适用的场景和性能特点。在选择集合类型时,应根据具体需求进行权衡和选择。

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com