Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
125942 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第8讲 | 对比Vector、ArrayList、LinkedList有何区别?

LinkedList
ArrayList
Vector
云计算任务调度系统的数据结构选择
理解Java提供的默认排序算法
选择适合的数据结构
排序算法的改进
并行排序算法
Java 9的静态工厂方法
Java 8的Lambda和Stream
AbstractList
List、Set、Queue/Deque
Collection接口
Queue/Deque
Set
List
一课一练
面试考点
集合框架的性能优化
集合框架的演进与发展
集合框架设计结构
Java集合框架

该思维导图由 AI 生成,仅供参考

我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C 语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java 提供了强大的集合框架,大大提高了开发者的生产力。
今天我要问你的是有关集合框架方面的问题,对比 Vector、ArrayList、LinkedList 有何区别?

典型回答

这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。
Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。
ArrayList 是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容时会提高 1 倍,而 ArrayList 则是增加 50%。
LinkedList 顾名思义是 Java 提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。

考点分析

似乎从我接触 Java 开始,这个问题就一直是经典的面试题,前面我的回答覆盖了三者的一些基本的设计和实现。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Java集合框架涵盖了Vector、ArrayList和LinkedList等常见List实现,它们在行为、性能和线程安全等方面存在显著差异。Vector是线程安全的动态数组,但同步开销较大;ArrayList是非线程安全的动态数组,性能较好;而LinkedList是双向链表,无需调整容量。选择使用时需权衡需求,如Vector和ArrayList适合随机访问,而LinkedList适合高效的节点插入和删除。掌握Java集合框架的设计结构、主要容器类型以及算法等知识对面试备考至关重要。文章还介绍了集合框架的整体设计、集合类型及其特点、排序算法、Java 8和Java 9的增强等内容。此外,提出了思考题,引导读者思考云计算任务调度系统中的数据结构选择。整体而言,本文深入浅出地介绍了Java集合框架的各个方面,为读者提供了全面的技术知识和思考问题的启发。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(63)

  • 最新
  • 精选
  • L.B.Q.Y
    置顶
    请教老师个问题,Collection接口的声明是带范型的,其中定义的Object[ ] toArray()方法为什么不是范型方式的?有什么原因吗?

    作者回复: 按照javadoc,我觉得这个方法设计目的,就是让调用者精确控制类型;里面声明了,toArray(new Object[0])等同于toArray()

    2018-05-23
    15
  • 孙晓刚
    置顶
    精选第一个对于读写效率问题,我觉得表述有问欠缺,或者说不能那么绝对。 1、并不是所有的增删都会开辟新内存,没有开辟新内存的尾部增,效率也是杠杠的。 2、尾部删除也不需要开辟新内存,只是移出最后一个对象。 之前我也是接收了ArrayList的特性随机访问快,增删效率差。直到看到源码才知道,没那么绝对。 直接导致结果就是本身适合使用ArrayList的场景会因为这个笼统的说法而选LinkedList

    作者回复: 嗯,我文中特意强调了不包括尾部

    2018-05-22
    5
    42
  • 雷霹雳的爸爸
    置顶
    在这个题目下,自然就会想到优先级队列了,但还需要额外考虑vip再分级,即同等级vip的平权的问题,所以应该考虑除了直接的和vip等级相关的优先级队列优先级规则问题,还得考虑同等级多个客户互相不被单一客户大量任务阻塞的问题,数据结构确实是基础,即便这个思考题考虑的这个场景,待调度数据估计会放在redis里面吧

    作者回复: 赞

    2018-05-22
    2
    109
  • 约书亚
    既然是Java的主题,那就用PriorityBlockingQueue吧。 如果是真实场景肯定会考虑高可用能持久化的方案。 其实我觉得应该参考银行窗口,同时三个窗口,就是三个队列,银台就是消费者线程,某一个窗口vip优先,没有vip时也为普通客户服务。要实现,要么有个dispatcher,要么保持vip通道不许普通进入,vip柜台闲时从其他队列偷

    作者回复: 有道理

    2018-05-22
    3
    89
  • linco_66
    由于要处理的任务有前后顺序关系,所以首先想到使用优先队列。使用 PriorityQueue,将VIP用户的优先级设置为最高,优先处理。借鉴操作系统中的调度算法,对于其他用户,我们还可以设计各种公平的优先级选择算法(基于排队先后顺序,基于调度任务所需的时间长短(操作系统中的短作业优先算法)排序、高响应比((所用时间+等待时间)/等待时间)优先进行排序),与 PriorityQueue 结合使用。 类似场景大多就是基于队列的数据结构了。实际工具的话,消息队列(MQ)就是很直接的例子了。可以使用消息队列对用户请求进行削锋操作,前台快速响应,后台私下进行处理操作。 除此之外可以想到优化:利用分布式系统的优点,将VIP用户的请求分发到运算力更高的服务器上进行处理。达到高可用的特点!

    作者回复: 非常不错的总结

    2019-01-07
    52
  • 马建超
    每天看一集,不断提高自己,加油

    作者回复: 加油

    2019-01-14
    6
  • 小笨蛋
    招聘时我更倾向于考察面试者自身最擅长的东西,免得招到纯面试高手?这个你一般会怎么面试?纯面试感受是一个什么样的表现?

    作者回复: 例如,介绍项目过程中,随机问某些细节方面,可能就比较陌生,判断下是忘了还是就参与有限

    2018-10-04
    2
    4
  • Miaozhe
    杨老师,问个问题,Collection接口下面已细化了List,Set和Queue子接口,未什么又定义了AbstractCollection这个抽象类?具体是什么考虑?以为我发现3个接口的子类都是集成这个抽象类。

    作者回复: 三个都是Collection,总还是有共同行为的

    2018-05-26
    4
  • 王宁
    面试的重点HashMap,实现原理,扩展什么的,1.7和1.8的区别。还有和hashtable的异同。还有juc下面集合的熟悉程度。

    作者回复: 下两篇就是

    2018-05-22
    4
  • 且以深情共白头
    之前一直以为Verctor不属于集合,只是数组。学习了。针对VIP客户任务优先处理场景,认为采用SortSet进行,按照默认排序即可,数值越小优先级越高,和线程的优先级级别一致

    作者回复: 和优先队列相比,不那么紧凑,例如treeset用的树比堆要多了节点开销

    2018-07-09
    2
收起评论
显示
设置
留言
63
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部