ArrayList与LinkedList、Vector的区别

一、ArrayList 和 LinkedList区别:

(1)两者都是线程不安全,都实现了Collection接口。

(2)数据结构:ArrayList是基于动态数组的数据结构,LinkedList是基于双向链表的数据结构。

(3)性能:ArrayList支持随机访问,查询快,增删慢,查询的时间复杂度为O(1),插入和删除的时间复杂度为O(n),因为对插入和删除位置后面的元素进行移动位置,以保证内存的连续性

LinkedList不支持随机访问,查询慢,增删快,查询的时间复杂度为O(n),插入和删除的时间复杂度为O(1)

ArrayList:

  • get() 直接读取第几个下标,复杂度 O(1);
  • add(E) 添加元素,直接在后面添加,复杂度O(1);
  • add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n);
  • remove()删除元素,后面的元素需要逐个移动,复杂度O(n)。

LinkedList:

  • get() 获取第几个元素,依次遍历,复杂度O(n);
  • add(E) 添加到末尾,复杂度O(1);
  • add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n);
  • remove()删除元素,直接指针指向操作,复杂度O(1)。

(4)空间的消耗:ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。

总结

ArrayList:

优点

  1. 随机访问效率高,适合查找和遍历操作
  2. 内存连续,缓存命中率高,性能相对较好。

缺点

  1. 插入和删除元素效率较低,特别是在中间插入或删除元素时。
  2. 动态扩容需要重新分配内存和复制元素,可能会影响性能。

LinkedList:

优点

  1. 插入和删除元素效率高,特别是在中间插入或删除元素时。
  2. 不需要频繁扩容,没有数组扩容带来的性能损耗。

缺点

  1. 随机访问效率低,需要从头或尾开始遍历。
  2. 每个节点需要额外的引用,占用更多内存空间。
二、ArrayList和Vector的区别:

(1)数据结构:ArrayList和Vector底层的数据结构都是数组。

(2)线程安全:Vector线程安全的,底层使用synchronize进行加锁,而ArrayList是线程不安全的。

(3)性能:由于Vector使用synchronize锁来确保线程的安全性,所以性能会稍逊于ArrayList。

(4)初始容量和扩容:ArrayList和Vector的默认初始容量都是10,但是扩容时,ArrayList容量会增长为原来的1.5倍,而Vector的容量会增长为原来的2倍。

(5)Vector实现的Enumeration接口,所以可以使用Enumeration进行遍历元素。

相关推荐
码匠许师傅4 小时前
【C++ 面试真题】C++ 的 const 和 constexpr 有什么区别?
c++·面试
坚持编程的菜鸟5 小时前
模拟实现memmove
c语言·算法·模拟实现memmove
码农颜6 小时前
5.4.1 锁分类
java·数据库·mysql
wabs6667 小时前
关于图论【最短路径之Dijkstra算法(堆优化版)|卡码网47.参加科学大会的思考】
数据结构·算法·图论·优先级队列·邻接表·小顶堆·卡码网
坚持编程的菜鸟7 小时前
编写判断大小端程序
c语言·算法·判断大小端
papaofdoudou7 小时前
判断排列逆序奇偶性的乘积判别法(范德蒙德符号法)
人工智能·算法
linux-hzh8 小时前
百日算法修炼 · Day 03
java·算法
问商十三载8 小时前
RAG 检索效果差怎么排查?2026 五层诊断法完整指南
开发语言·人工智能·windows·python·算法
不负岁月无痕8 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试
mister_guo8 小时前
Java线程池参数应该如何设置(ThreadPoolExecutor)
java