首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java高频面试题- 每日三连问?【Day3】 — 集合容器篇

Java高频面试题- 每日三连问?【Day3】 — 集合容器篇

作者头像
浩说编程
发布2021-08-16 17:35:03
发布2021-08-16 17:35:03
7520
举报
文章被收录于专栏:Java经验之谈Java经验之谈

问题导读

一、说一下List、Set、map的区别吧

二、说一下Vector、ArrayList、LinkedList 有何不同?

追问-1:分别适合在什么场景下使用呢?

追问-2:如何在多线程的场景下使用ArrayList?

三、你知道如何对数组对象排序吗?

01

说一下List、Set、map的区别吧

正经回答:

List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。

Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet。

Map:是一个键值对集合,存储键、值和之间的映射。Key无序,唯一;value 不要求有序,允许重复。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

02

说一下Vector、ArrayList、LinkedList 有何区别?

正经回答:

三者都是List的实现类,区别在于:

1、ArrayList和LinkedList非线程安全,而vector线程安全。

2、从数据结构方面来讲,ArrayList和vector基于数组实现,而LinkedList基于链表实现

深入追问:

追问1:分别适合在什么场景下使用呢?

Vector:

  是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。

  Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量。当数组已满,开始扩容时,会先创建新的扩容后数组,并拷贝原有数组数据,最后删除原数组。

ArrayList(擅长 "查询" 和 "更新" 场景):

是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容时会提高 1 倍,而 ArrayList 则是增加 50%。

  • 数据结构:ArrayList 是动态数组的数据结构实现;
  • 随机查询效率:(优势),ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找,而ArrayList根据角标index直接锁定位置。
  • 插入和删除效率:在List中间插入和删除数据时,ArrayList 要比 LinkedList 效率低很多,因为 ArrayList 增删操作要影响数组内的其他数据的下标(整体移动),而如果是正常的末尾追加方式,效率大体相同。
  • 内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

LinkedList(擅长 "插入" 和 "删除" 场景):

  顾名思义是 Java 提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。

  • 数据结构:LinkedList 是双向链表的数据结构实现。
  • 随机查询效率:相比ArrayList (劣势)
  • 插入和删除效率:LinkedList按序号查询数据时需要进行前向或后向遍历,但插入数据时只需要记录当前项的前后项即可,增删时也只需修改链表指向即可,所以 LinkedList 插入和删除速度较快。(优势)
  • 内存空间占用:相比ArrayList (劣势)

追问2:如何在多线程的场景下使用ArrayList?

可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样:

代码语言:javascript
复制
List<String> syncList = Collections.synchronizedList(arraylist);

03

你知道如何对数组对象排序吗?

正经回答:

如果我们需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。

如果我们需要排序一个对象列表,我们可以使用Collection.sort()方法。

两个类都有用于自然排序(使用Comparable)或基于标准的排序(使用Comparator)的重载方法sort()。

Collections内部使用数组排序方法,所有它们两者都有相同的性能,只是Collections需要花时间将列表转换为数组。

每日小结

今天我们复习了面试中常考的集合容器三个问题,你做到心中有数了么?

对了,如果你的朋友也在准备面试,请将这个系列扔给他,如果他认真对待,肯定会感谢你的!!

好了,今天就到这里,学废了的同学,记得三连,也会给我继续更新的动力。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩说编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正经回答:
  • 正经回答:
  • 深入追问:
    • 追问1:分别适合在什么场景下使用呢?
    • 追问2:如何在多线程的场景下使用ArrayList?
  • 正经回答:
  • 每日小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档