Java面试题冲刺第三天--集合框架篇

目录
  • 面试题1:对比 Vector、ArrayList、LinkedList 有何区别?适合在什么场景下使用
    • 正经回答:
    • 深入追问:
      • 追问1:多线程场景下就不能使用ArrayList么?
      • 追问2:说一下 HashSet 的实现原理?
      • 追问3:HashSet是如何保证Key不重复的?
  • 面试题2:List 和 Set 有哪些区别? 正经回答:
  • 面试题3:Array 和 ArrayList 有何区别?
    • 正经回答:
  • 总结

面试题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<String> 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可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变

曾测试过1000万元素情况下,Set查询第9999999个元素用时0.203秒,List查询第9999999个元素用时0.01秒;

追问2:说一下 HashSet 的实现原理?

HashSet 底层是基于 HashMap 实现的,能够继承 HashMap 的所有特性,因此 HashSet 结构也是数组+链表+红黑树,同样也不能使用get方法,HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,不允许key重复,但支持null对象作为key。

追问3:HashSet是如何保证Key不重复的?

HashSet 的值是不能重复的,在业务上经常被用来做数据去重的工作,那么,他是怎么保证元素不重复的呢?

当我们对一个HashSet 的实例添加一个值时,使用到的是它的 add 方法,源码如下:

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

由代码中的 add 方法实现可知,其维护了一个 HashMap 来实现元素的添加;我们知道,HashMap 作为双列集合,它的键是不能够重复的,HashMap 针对 hashCode 相同且 equals 比较值相同的时候执行的是更新操作,所以Hashmap中的key是唯一的,也决定了hashset元素值也是唯一的。

面试题3:Array 和 ArrayList 有何区别?

正经回答:

  • Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
  • Array 是指定固定大小的,而 ArrayList 大小是自动扩展的。
  • Array 内置方法没有 ArrayList 多,比如 addAll、removeAll、iteration 等方法只有 ArrayList 有。

Array 和 ArrayList可以互相转换,Array 转 List有: Arrays.asList(array);而List 转 Array有:List.toArray()方法。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java面试题冲刺第十一天--集合框架篇(2)

    目录 面试题1:说一下 HashMap 的实现原理? 正经回答: 深入追问: 追问1:如何实现HashMap的有序? 追问2:那TreeMap怎么实现有序的? 追问3:put方法原理是怎么实现的? 追问4:HashMap扩容机制原理 追问5:HashMap在JDK1.8都做了哪些优化? 追问6:链表红黑树如何互相转换?阈值多少? 面试题2:HashMap是线程安全的吗? 正经回答: 追问1:你是如何解决这个线程不安全问题的? 总结 面试题1:说一下 HashMap 的实现原理? 正经回答: 众所

  • Java面试题冲刺第四天--数据库

    目录 面试题1:你对数据库优化有哪些了解呀? 正经回答: 深入追问: 追问1:那你对SQL优化方面有哪些技巧呢? 追问2:嗯,那你说一下为什么不建议用SELECT * 呢? 二.SELECT语句的一些其他优化 面试题2:你对分库分表是怎么看的呀? 正经回答: 1.垂直分表 2.水平分表 3.垂直分库 4.水平分库 深入追问: 追问1:毫无意义,我真的不想问他MySQL问题了 面试题3:MySQL删除数据的方式都有哪些? 正经回答: 深入追问: 追问1:说一下 delete.truncate.dr

  • Java面试题冲刺第八天--Spring框架2

    目录 面试题1:聊一下你对AOP的理解吧? 追问1:Advice通知的类型有哪几种? 追问2:在同一个切面(Aspect)中,不同Advice的执行顺序 面试题2:AspectJ AOP 和 Spring AOP 有什么区别? 追问1:了解JDK动态代理和CGLIB动态代理的原理么?他俩有哪些区别? 面试题3:什么是基于Java的Spring注解配置? 给一些注解的例子 总结 面试题1:聊一下你对AOP的理解吧? AOP(Aspect Oriented Programming),面向切面思想,是

  • Java面试题冲刺第七天--Spring框架1

    目录 面试题1:能简单说一下你对Spring框架的理解么? 追问1:常见的Core组件有哪些? 面试题2:谈谈对Spring IOC的理解 追问1:Spring中的bean的作用域有哪些? 追问2:Spring中的bean生命周期? 追问3: Spring 中的 bean 是线程安全的吗? 面试题3:说一下 SpringMVC 运行流程? 追问1:能介绍一下SpringMVC各组件的作用么? 总结 面试题1:能简单说一下你对Spring框架的理解么? 我们一般说的Spring框架就是Spring

  • Java面试题冲刺第五天--基础篇2

    目录 面试题1:说一下抽象类和接口有哪些区别? 正经回答: 深入追问: 追问1:说一说你对抽象类的理解吧,他到底是干啥用的 追问2:用抽象类实现一个接口,和普通类实现接口会有什么不同么? 追问3:抽象类能使用 final 修饰吗? 面试题2:final 在 Java 中有什么作用? 正经回答: 1.修饰类 2.修饰方法 3.修饰变量 深入追问: 追问1:能分别说一下final.finally.finalize的区别么? 面试题3:你对Java序列化了解么? 正经回答: 深入追问: 追问1:Jav

  • Java面试题冲刺第三天--集合框架篇

    目录 面试题1:对比 Vector.ArrayList.LinkedList 有何区别?适合在什么场景下使用 正经回答: 深入追问: 追问1:多线程场景下就不能使用ArrayList么? 追问2:说一下 HashSet 的实现原理? 追问3:HashSet是如何保证Key不重复的? 面试题2:List 和 Set 有哪些区别? 正经回答: 面试题3:Array 和 ArrayList 有何区别? 正经回答: 总结 面试题1:对比 Vector.ArrayList.LinkedList 有何区别?

  • Java面试题冲刺第三十天--数据库(6)

    目录 面试题1:有个需求需要快速删除MySQL表中一亿条数据,表中有2亿数据,能说一下你的思路么? 1.复制表+删除索引 2.分批插入数据 3.drop删除掉老表 4.重命名新表为new_T 面试题2:刚才你提到了逻辑删除,你是怎么看逻辑删除和物理删除的? 面试题3:大型项目中,mysql的主键需要全局唯一怎么办? 总结 面试题1:有个需求需要快速删除MySQL表中一亿条数据,表中有2亿数据,能说一下你的思路么? 我们知道MySQL删除数据的方式有多种比如DELETE.TRUNCATE.DROP

  • Java面试题冲刺第十四天--基础篇3

    目录 面试题1:JDK1.8的新特性有哪些? 接口的默认和静态方法: Lambda 表达式: 方法与构造函数引用: 函数式接口: Annotation 注解:支持多重注解: 新的日期时间 API: Base64编码: JavaScript引擎Nashorn: Stream的使用: Optional: 扩展注解的支持: 并行(parallel)数组: 编译器优化: 其他核心 API 的改进 Java IO改进 集合 API 的改进 面试题2:什么是内部类?内部类的作用? 内部类的作用 内部类特点

  • Java面试题冲刺第十四天--PRC框架

    目录 面试题1:说说你对RPC框架的理解? 追问1:RPC框架实现原理是什么样的 1.建立通信 2.服务寻址 3.网络传输 4.服务调用 面试题2:常见的RPC框架有哪些? 面试题3:说说RPC和SOA.SOAP.REST的区别吧 1.REST 2.SOAP 3.SOA 总结 面试题1:说说你对RPC框架的理解?   RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法.它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不

  • Java面试题冲刺第一天--基础篇1

    目录 面试题1:Java 中操作字符串都有哪些类?它们之间有什么区别? 正经回答: 深入追问: 追问1:这三者在效率上怎么说? 追问2:那StringBuffer和StringBuffer线程安全主要差在哪里呢? 面试题2:请你说一下Error 和 Exception 区别是什么? 正经回答: 面试题3:== 和 equals 的区别是什么 正经回答: 深入追问: 追问1:如果我们不重写equals() 方法,会怎么样? 追问2:重写equals的同时,我们需要重写hashCode()方法么?为

  • Java面试题冲刺第二十三天--算法(2)

    目录 面试题1:你说一下常用的排序算法都有哪些? 追问1:谈一谈你对快排的理解吧 追问2:说一下快排的算法原理 追问3:来吧!给我手敲一个快排 面试题2:来!再给我手撸一个Spring 追问1:哦,咳咳-说一下构成递归的前提条件有啥? 追问2:递归都有哪些优缺点? 追问3:给我手写一个简单的递归算法的实现吧 面试题3: 10亿个数中找出最大的100000个数(top K问题) 总结 面试题1:你说一下常用的排序算法都有哪些? 追问1:谈一谈你对快排的理解吧 快速排序,顾名思义就是一种以效率快为特

  • Java面试题冲刺第十七天--基础篇3

    目录 面试题1:JDK1.8的新特性有哪些? 接口的默认和静态方法: Lambda 表达式: 方法与构造函数引用: 函数式接口: Annotation 注解:支持多重注解: 新的日期时间 API: Base64编码: JavaScript引擎Nashorn: Stream的使用: Optional: 扩展注解的支持: 并行(parallel)数组: 编译器优化: 其他核心 API 的改进 Java IO改进 集合 API 的改进 面试题2:什么是内部类?内部类的作用? 内部类的作用 内部类特点

  • Java面试题冲刺第九天--MyBatis2

    目录 面试题1:说说你对Mybatis的理解? 追问1:说一下MyBatis的工作原理和流程吧. 追问2:列举几个MyBatis的核心组件,说说分别干啥用? 面试题2:(问几个实际使用的问题)Mybatis动态sql是做什么的?都有哪些动态sql? 追问1:Xml映射文件中,除了常见的select|insert|updae|delete标签之外,你还常用哪些标签? 追问2:Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? 追问3:MyBatis中接口绑定你都用过哪几

随机推荐