栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Java岗大厂面试 - 日积月累,每日三题(kafka基本原理及leader)

Java岗大厂面试 - 日积月累,每日三题(kafka基本原理及leader)

面试题1:对比 Vector、ArrayList、linkedList 有何区别?适合在什么场景下使用

正经回答:

这三者都是 实现了集合框架中的 List ,也就是 有序集合 ,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。

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 (劣势)

深入追问:

追问1:多线程场景下就不能使用ArrayList么?

我们知道ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样:

List syncList = Collections.synchronizedList(arraylist);

面试题2:List 和 Set 有哪些区别?

正经回答:

List、Set 都是继承自Collection 接口,区别主要有以下几点:

  • 重复对象

list方法可以允许重复的对象,而set方法不允许重复对象;

  • null元素

list可以插入多个null元素,而set只允许插入一个null元素;

  • 容器是否有序

list是一个有序的容器,保持了每个元素的插入顺序。即输出顺序就是输入顺序,而set方法是无序容器,无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序

  • 常用的实现类

list方法常用的实现类有 :

ArrayList、linkedList 和 Vector。ArrayList最常用,提供使用索引(index)访问,定位、查询效率高;而linkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适,Vector 表示底层数组,线程安全,效率低被边缘化~

Set方法中常用的实现类有 :

HashSet、linkedHashSet 以及 TreeSet。最常用的是基于 HashMap 实现的 HashSet;另外TreeSet 还实现了 SortedSet 接口(支持排序),因此 TreeSet 是一个可根据 compare() 和compareTo()方法进行排序的有序容器。

  • 遍历方式

List 支持for循环,也就是通过下标来遍历,也可以用迭代器(Iterator),但是set只能用迭代,因为他无序,无法用下标来取得想要的值。

深入追问:

追问1:Set 和 List 效率上对比怎么样呢?

Set :

删除和插入效率高,插入和删除不会引起元素位置改变。检索元素的话,效率低下;当然,在 理想情况下 ,不考虑哈希冲突的情况,且仅需一次定位即可完成,时间复杂度为O(1),但是不现实。

List :

和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变

学习分享,共勉

这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富, 囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!

资料整理不易,读者朋友可以转发分享下!

Java核心知识体系笔记.pdf

中高级Java开发面试高频考点题笔记300道.pdf

架构进阶面试专题及架构学习笔记脑图

Java架构进阶学习视频分享

http://【腾讯文档】资料获取方式 https://docs.qq.com/doc/DS1RIZEdEemxWckpNhttp://【腾讯文档】资料获取方式 https://docs.qq.com/doc/DS1RIZEdEemxWckpN

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/674307.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号